
root
내 Debian의 crontab 에 다음 코드가 있습니다.
* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log
하지만 내가 지정한 파일 run.log
은 없습니다 . run.lock
실제로 스크립트가 실행되었다는 증거는 없습니다.
실행하면 ps aux | grep run
해당 grep
호출만 생성됩니다.
루트에서 run
스크립트를 어떻게 실행합니까 ?flock
crontab
답변1
crontab 줄의 명령이 예상한 대로 구문 분석되지 않습니다.
cron 데몬은 해당 사용자에 대해 구성된 셸을 사용하여 명령을 실행합니다.
이 첫 번째 셸에는 제어 연산자로 구분된 두 개의 명령이 표시됩니다 &&
. 따라서 두 번째 명령은 첫 번째 명령이 성공을 나타내는 0 반환 코드로 종료되는 경우에만 실행됩니다.
첫 번째 명령은 다음과 같습니다 flock -xn /absolute/path/to/run.lock -c cd /absolute/path/to/project
.
두 번째 명령은 다음과 같습니다 ./run >> run.log
.
첫 번째 명령은 잠금 파일을 생성하고 해당 명령을 cd
하위 프로세스, 즉 쉘의 다른 인스턴스로 실행합니다. 인수가 없는 명령 cd
은 사용자의 홈 디렉토리로 변경되며, 그 후 실행된 쉘은 flock
즉시 종료됩니다. 이는 전혀 효과가 없습니다.
경로 이름이 있어도 여기 명령은 명령의 작업 디렉토리나 쉘의 첫 번째 인스턴스에서 실행되는 두 번째 명령에 cd /absolute/path/to/project
전혀 영향을 미치지 않습니다 .flock
cd
이는 명령이 부모가 아닌 실행되는 특정 셸 인스턴스에만 영향을 미치기 때문입니다 .
는 의 매개변수가 아닌 명령 /absolute/path/to/project
의 추가 파일 이름으로 처리 됩니다 .flock
cd
첫 번째 명령이 종료되고 오류를 보고하지 않았으므로 쉘의 첫 번째 인스턴스(원래 cron
데몬에 의해 시작됨)는 이제 두 번째 명령을 실행합니다. 해당 셸의 작업 디렉터리는 변경되지 않았으므로 여전히 사용자의 홈 디렉터리이므로 root
결국 /root/run >>/root/run.log
.
내 추측으로는 아마도 다음과 같은 의미를 가지고 있었던 것 같습니다.
* * * * * flock -xn /absolute/path/to/run.lock -c "cd /absolute/path/to/project && ./run >> run.log"
따옴표는 첫 번째 셸이 에서 명령줄을 분할하는 것을 방지하므로 &&
두 번째 셸( flock
명령으로 시작됨)은 나머지 명령줄 전체를 가져오므로 명령 은 프로젝트 디렉터리에서 cd /absolute/path/to/project
실행되기 전에 의미 있게 실행됩니다 ../run