at
FreeBSD에서 이 작업을 즉시 수행할 수 있는 방법이 있습니까 ?
Ubuntu에서는 "at now"를 사용하여 스크립트를 실행하면 즉시 실행됩니다. FreeBSD의 경우 at이 crontab을 통해 실행되기 때문에 지연이 있습니다. 기본값은 5m입니다.
*/5 * * * * root /usr/libexec/atrun
1m마다 실행되도록 변경했습니다.
*/1 * * * * root /usr/libexec/atrun
1m는 아직 꽤 긴 기다림이다. at
Ubuntu에서와 마찬가지로 FreeBSD에서도 즉시 실행할 수 있는 방법이 있습니까 ?
편집하다: 이것은 at
명령을 실행하는 데 사용하는 코드입니다. at now
Ubuntu에서는 즉시 작동하지만 FreeBSD에서는 작동하지 않습니다. 이것이 Ubuntu에서 어떻게 작동하는지 파악하는 방법을 모르지만 at
FreeBSD에서는 crontab 일정에 따라 실행되어 지연이 발생합니다.
shell_exec("echo /usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} | at now");
편집하다: cron을 기다리는 대신 수동으로 atrun을 실행하려고 하면 다음 오류가 발생합니다.
atrun: setegid failed: Operation not permitted
사용자에게 자신의 예약된 명령을 실행할 수 있는 권한을 부여하여 이 문제를 해결하는 방법을 잘 모르겠습니다.
답변1
앰퍼샌드는 당신의 친구입니다
가위를 들고 뛰지 마세요. 당신은 잘못된 이유로 매우 타당한 질문을 하고 있습니다.
at
cron
향후 작업을 예약하는 데 사용됩니다 . 이러한 목적을 위한 훌륭한 도구입니다. 그러나 오늘 작업을 완료하기 위해 일정 도구를 사용하면 물 속을 왔다 갔다 하는 것과 마찬가지입니다. Mel Bursland가 이를 지적하고 정답을 알려 주었습니다. 그런 다음 귀하는 귀하의 요구 사항을 명확히 하려고 노력했지만 불행하게도 그의 관점을 이해하지 못했습니다. 단순히 & 기호를 사용해야 할 때 at
- 사용을 고집합니다 &
.
다른 독자들에게 질문은 "php가 다른 스크립트를 실행(생성)하고 스크립트가 완료될 때까지 기다리지 않고 계속 진행하려면 어떻게 해야 합니까?"에 관한 것입니다.
그런 다음 MelBurslan이 보여주듯이 몇 가지 훌륭한 UNIX 기본 사항을 안내합니다.
nohup /path/to/myprogram & 2>&1
nohup
현재 사용자가 로그아웃하더라도 명령이 백그라운드에서 계속 실행되는지 확인하세요.&
아마도 누락된 것은 & 기호가 프로세스의 연결을 끊고 백그라운드로 보내는 것입니다.2>&1
stderr
(2)를stdout
(1) 과 연결하고nohup
암시적으로 출력을 다음으로 보냅니다.nohup.out
& 기호를 추가하지 않으면 호출자(여기서는 PHP)가 작업이 완료될 때까지 기다립니다.
Cass처럼 토끼굴에 빠지면지적shell_exec
- 그러면 사람들이 이 기술을 및와 함께 어떻게 사용하는지 확인할 수 있습니다 exec
(참조여기)
이것으로부터 알아야 할 다른 중요한 사항:
출력에 관심이 없으면 /dev/null
다음과 같이 보낼 수 있습니다.
> /dev/null
그러면 리디렉션됩니다 stdout
. 오류 메시지도 원하지 않으면 stderr
다음과 같이 리디렉션할 수 있습니다.
2> /dev/null
이를 한 줄로 결합할 수 있습니다.
> /dev/null 2> /dev/null
짧은 형식이 있습니다. stderr를 stdout으로 보내고 stdout을 "nothing"으로 보냅니다.
> /dev/null 2>&1
이제 이 지식을 실제로 적용해 보겠습니다.
귀하의 예는 다음과 같습니다 at
.
shell_exec("echo /usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} | at now");
하지만 스크립트를 계속 진행하려면 앰퍼샌드만 추가하면 됩니다.&
shell_exec("/usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} &");
출력을 사용하지 않는 경우 리디렉션해야 합니다.
shell_exec("/usr/local/bin/php -q scripts/myfile.php {$var1} {$var2} > /dev/null 2>&1 &");
Brent Braisley가 제안한 가장 우아한 버전은 다음과 같습니다.
exec("nohup /usr/bin/php -q scripts/myfile.php {$var1} {$var2} > /dev/null 2>&1 &");
과다 사용
이 at
명령은 실행할 스크립트를 예약합니다 atrun
.
당신이 읽으면매뉴얼 페이지당신이 찾을 수 있기 때문에 at
:
Note that at is implemented through the cron(8) daemon by calling
atrun(8) every five minutes. This implies that the granularity of at
might not be optimal for every deployment. If a finer granularity is
needed, the system crontab at /etc/crontab needs to be changed.
crontab을 조정했습니다. 귀하의 경우에는 이 작업을 수행하지 않는 것이 좋습니다. 하지만 고집한다면 꼭 확인해보세요인간 크론탭 (5):
string meaning
------ -------
@reboot Run once, at startup of cron.
@yearly Run once a year, "0 0 1 1 *".
@annually (same as @yearly)
@monthly Run once a month, "0 0 1 * *".
@weekly Run once a week, "0 0 * * 0".
@daily Run once a day, "0 0 * * *".
@midnight (same as @daily)
@hourly Run once an hour, "0 * * * *".
@every_minute Run once a minute, "*/1 * * * *".
@every_second Run once a second.
즉, */1
1분에 한 번씩 변경할 수 있습니다 @every_second
.
하지만 - 제발 - 그러지 마세요 :-)
atrun을 수동으로 실행
당신이 제안한대로 그것을 남용 해서는 안됩니다 atrun
. (컨텍스트에서) "모든" 작업은 &
백그라운드에서 작업을 실행하기 위해 앰퍼샌드를 추가하는 것입니다.
이 실패의 가장 큰 이유는 귀하가 일반 사용자로 로그인했기 때문입니다. at
기본적으로 루트만 액세스할 수 있습니다. 이를 변경해야 하는 경우 at 및 맨 페이지를 살펴보십시오.
/var/at/at.allow allow permission control
/var/at/at.deny deny permission control
하지만 - 다시 한번 - 제발 - 하지 마세요 :-)
다른 모든 방법이 실패하면...
다른 모든 방법이 실패하면 질문을 다시 작성해 주세요. 일정 도구 실행지금문제의 근본 원인이 아닙니다. 위의 내용이 충분하지 않다면 더 자세히 살펴봐야 합니다.