루트 크론의 무리 명령이 실행되지 않습니다

루트 크론의 무리 명령이 실행되지 않습니다

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스크립트를 어떻게 실행합니까 ?flockcrontab

답변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전혀 영향을 미치지 않습니다 .flockcd이는 명령이 부모가 아닌 실행되는 특정 셸 인스턴스에만 영향을 미치기 때문입니다 .

는 의 매개변수가 아닌 명령 /absolute/path/to/project의 추가 파일 이름으로 처리 됩니다 .flockcd

첫 번째 명령이 종료되고 오류를 보고하지 않았으므로 쉘의 첫 번째 인스턴스(원래 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

관련 정보