PHP 함수를 사용하여 Linux "at" 작업을 예약하는 PHP 웹 애플리케이션이 있습니다 exec()
. 예약된 작업은 또 다른 PHP 스크립트입니다. 어쨌든 먼 미래에 예약된 작업은 동일한 작업을 동시에 예약하는 것과 관련이 있다고 의심되는 특정 조건에서 즉시 실행됩니다. 예를 들어, 어제 이 기능을 테스트하고 있었는데 "at" 작업이 조기에 실행되었습니다.
작업 출력을 /var/log/
이라는 파일 로 리디렉션했습니다 at_job.log
. 작업은 작업이 예약된 시간인 어제(2월 20일) 21:17 UTC(오후 9:17)에 실행되었습니다. 2월 21일 17시 57분(UTC)(오후 5시 57분) 기준 로그 파일의 내용은 다음과 같습니다.
..
job 72 at Thu Feb 21 23:07:00 2019
job 73 at Thu Feb 21 23:17:00 2019
다음은 같은 시간(2월 21일 17:57 UTC)의 "at" 작업 대기열입니다.
# atq
73 Thu Feb 21 23:17:00 2019 a staging
이것이 어떻게 가능한지, 내가 뭘 잘못하고 있는지 궁금합니다. 그 이후로 나는 작업 일정이 동시에 잡혀지지 않도록 안전 장치를 마련했지만 여기서 무슨 일이 일어나고 있는지 100% 확신할 수는 없습니다.
고쳐 쓰다:
아래에서 실행한 명령은 다음과 같습니다(일부 세부 정보를 숨기기 위해 약간 변경됨).
/usr/bin/php -q /PATH/TO/PHP/SCRIPT/cli_admin.php cli product_list_edit 20 | at -m 2206 21.02.2019 >> /var/log/at_log.log 2>&1
이로 인해 스크립트가 즉시 실행될 뿐만 아니라 나중에 예정된 작업도 실행되는 것 같습니다(중복된 항목은 퍼티 창에서 직접 테스트 중인 명령입니다).
atq
75 Thu Feb 21 22:06:00 2019 a staging
76 Thu Feb 21 22:06:00 2019 a root
74 Thu Feb 21 21:43:00 2019 a staging
답변1
at
이는 명령을 실행할 위치를 잘못 이해한 것 같습니다.
이 at
명령은 표준 입력에서 실행할 명령을 읽습니다.
at
특정 시간에 명령을 실행 하려면 php
명령(출력이 아님)을 입력해야 합니다 at
.
echo '/usr/bin/php -q /PATH/TO/PHP/SCRIPT/cli_admin.php cli product_list_edit 20' | at ...
또는,
at ... <<END_JOB
/usr/bin/php \
-q /PATH/TO/PHP/SCRIPT/cli_admin.php \
cli product_list_edit 20
END_JOB
( ...
옵션은 어디에 있습니까 at
?)
또는 파일에서 명령을 읽으려면
at -f filename ...