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