앰퍼샌드는 당신의 친구입니다

앰퍼샌드는 당신의 친구입니다

atFreeBSD에서 이 작업을 즉시 수행할 수 있는 방법이 있습니까 ?

Ubuntu에서는 "at now"를 사용하여 스크립트를 실행하면 즉시 실행됩니다. FreeBSD의 경우 at이 crontab을 통해 실행되기 때문에 지연이 있습니다. 기본값은 5m입니다.

*/5     *        *       *       *       root    /usr/libexec/atrun

1m마다 실행되도록 변경했습니다.

*/1     *        *       *       *       root    /usr/libexec/atrun

1m는 아직 꽤 긴 기다림이다. atUbuntu에서와 마찬가지로 FreeBSD에서도 즉시 실행할 수 있는 방법이 있습니까 ?

편집하다: 이것은 at명령을 실행하는 데 사용하는 코드입니다. at nowUbuntu에서는 즉시 작동하지만 FreeBSD에서는 작동하지 않습니다. 이것이 Ubuntu에서 어떻게 작동하는지 파악하는 방법을 모르지만 atFreeBSD에서는 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

앰퍼샌드는 당신의 친구입니다

가위를 들고 뛰지 마세요. 당신은 잘못된 이유로 매우 타당한 질문을 하고 있습니다.

atcron향후 작업을 예약하는 데 사용됩니다 . 이러한 목적을 위한 훌륭한 도구입니다. 그러나 오늘 작업을 완료하기 위해 일정 도구를 사용하면 물 속을 왔다 갔다 하는 것과 마찬가지입니다. Mel Bursland가 이를 지적하고 정답을 알려 주었습니다. 그런 다음 귀하는 귀하의 요구 사항을 명확히 하려고 노력했지만 불행하게도 그의 관점을 이해하지 못했습니다. 단순히 & 기호를 사용해야 할 때 at- 사용을 고집합니다 &.

다른 독자들에게 질문은 "php가 다른 스크립트를 실행(생성)하고 스크립트가 완료될 때까지 기다리지 않고 계속 진행하려면 어떻게 해야 합니까?"에 관한 것입니다.

그런 다음 MelBurslan이 보여주듯이 몇 가지 훌륭한 UNIX 기본 사항을 안내합니다.

nohup /path/to/myprogram & 2>&1
  • nohup현재 사용자가 로그아웃하더라도 명령이 백그라운드에서 계속 실행되는지 확인하세요.

  • &아마도 누락된 것은 & 기호가 프로세스의 연결을 끊고 백그라운드로 보내는 것입니다.

  • 2>&1stderr(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.

즉, */11분에 한 번씩 변경할 수 있습니다 @every_second.

하지만 - 제발 - 그러지 마세요 :-)

atrun을 수동으로 실행

당신이 제안한대로 그것을 남용 해서는 안됩니다 atrun. (컨텍스트에서) "모든" 작업은 &백그라운드에서 작업을 실행하기 위해 앰퍼샌드를 추가하는 것입니다.

이 실패의 가장 큰 이유는 귀하가 일반 사용자로 로그인했기 때문입니다. at기본적으로 루트만 액세스할 수 있습니다. 이를 변경해야 하는 경우 at 및 맨 페이지를 살펴보십시오.

 /var/at/at.allow        allow permission control
 /var/at/at.deny         deny permission control

하지만 - 다시 한번 - 제발 - 하지 마세요 :-)

다른 모든 방법이 실패하면...

다른 모든 방법이 실패하면 질문을 다시 작성해 주세요. 일정 도구 실행지금문제의 근본 원인이 아닙니다. 위의 내용이 충분하지 않다면 더 자세히 살펴봐야 합니다.

관련 정보