アンパサンドはあなたの友達です

アンパサンドはあなたの友達です

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

これを1行にまとめることができます。

 > /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分に1回ずつ変更できます@every_second

しかし - してください - しないでください:-)

atrunを手動で実行

あなたが提案したようにそれを乱用しないでくださいatrun。 (コンテキストで)「すべての」タスクは、&バックグラウンドでタスクを実行するためにアンパサンドを追加することです。

この失敗の主な理由は、ユーザーが一般ユーザーとしてログインしているためです。atデフォルトでは、ルートのみアクセスできます。これを変更する必要がある場合は、atとmanページを見てください。

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

しかし - もう一度 - してください - しないでください:-)

他のすべての方法が失敗した場合...

他のすべての方法が失敗した場合は、質問を書き直してください。スケジュールツールの実行問題の根本的な原因ではありません。上記が十分でない場合は、さらに詳しく見てください。

関連情報