crontab 용 파이썬 조건문 작성

Aug 21 2020

crontab에서 편집 할 때 python if 문은 어떻게 작동합니까? Python 3.6.3 사용

linux crontab을 사용하여 경고를 예약 할 수 있도록 디렉터리 ( "."및 ".."디렉터리 제외) 내의 숨겨진 파일 수를 확인하려고합니다. 다음은 문자열 형식으로 금액을 가져옵니다.

import subprocess
res = subprocess.run('ls -Ap | egrep "^\..*/$" | wc -l', shell=True, universal_newlines=True, stdout=subprocess.PIPE);
print(res.stdout)

output>>> (integer type string)

그런 다음 나는

if res.stdout != "0":
   (executeAlert.sh script)
else:
   (ignore)

도움을 주시면 감사하겠습니다.

답변

1 tripleee Aug 21 2020 at 14:43

훨씬 더 나은 해결책은 하위 프로세스를 완전히 피하는 것입니다. (하위 프로세스를 사용하더라도 스크립트에서 사용하지 마십시오 ls.)

from pathlib import Path

dotfiles = Path().glob('.[!.]*')
if len(list(dotfiles)) > 0:
    do_things()

실제로 길이를 확인할 필요가 없습니다. 당신은 말할 수 있습니다

dotfiles = list(Path().glob('.[!.]*'))
if dotfiles:
    do_things('The files which matched are %s' % dotfiles)

다소 모호하지만 더 간결하게 대신 생성기를 반복 할 수 있습니다. 루프 본문은 일치하는 파일이 하나 이상있는 경우에만 실행됩니다. 첫 번째 파일을 찾으면 중지하므로 파일이 하나 이상 있는지 여부 만 신경 쓰는 경우 최적화입니다.

for file in Path().glob('.[!.]*'):
    do_things()
    break

Python은 스크립트 실행 여부에 상관하지 않습니다 cron( cron비표준 위치에 라이브러리를 설치 한 경우 작업 에서 Python 환경을 정렬해야하는 경우도 있음). 그러나 모든 비즈니스 로직이 쉘 스크립트에 있다면 왜 여기에서 Python을 사용하고 있습니까? (쉘 스크립팅은 피해야 할 몇 가지 반 패턴을 연구하는 것도 도움이 될 수 있습니다 .)

다음은 유사한 논리를 사용하는 쉘 스크립트의 전체 내용입니다.

for file in .[!.]*; do
    test -e "$file" || break  # cf nullgbob
    executeAlert.sh
    break
done

Bash는 shopt -s nullglob와일드 카드가 일치하지 않는 경우 루프에 들어 가지 않도록 합니다 . 그러나 cron달리고 sh여기서 bashisms를 피하는 것은 완전히 어렵지 않습니다 (일치하지 않는 경우 globbing 행동 놀랍습니다).

쉘 스크립트에서 모든 일치 항목을 원하면 다음과 같이 말할 수 있습니다.

set -- .[!.]*
if [ "$@" != ".[!.]*" ]; then
    executeAlert.sh "$@"   # argument is list of matching files
fi

Bash 또는 ksh를 사용하는 경우 일치 항목을 배열로 수집 할 수 있습니다.

shopt -s nullglob
dotfiles=(.[!.]*)
for file in "${dotfiles[@]}"; do
   echo "Here's one dotfile: $file" done if [[ "${#dotfiles[@]}" > 0 ]]; then
     executeAlert.sh "${dotfiles[@]}"
fi

귀하의 egrep정규식는 점에서 일치합니다 디렉토리; 나는 이것이 실수라고 생각했습니다.

Oneiros Aug 21 2020 at 14:03

인쇄 res.stdout는 그 안에 끝줄 문자가 있음을 보여줍니다.

>>>res.stdout
'0\n'

따라서 '\ n'문자를 제거하십시오.

res = res.stdout.strip('\n')
if res == "0":
    (executeAlert.sh script)

또는 정수로 캐스트하십시오.

if int(res.stdout) == 0:
    (executeAlert.sh script)