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
これを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.
つまり、*/1
1分に1回ずつ変更できます@every_second
。
しかし - してください - しないでください:-)
atrunを手動で実行
あなたが提案したようにそれを乱用しないでくださいatrun
。 (コンテキストで)「すべての」タスクは、&
バックグラウンドでタスクを実行するためにアンパサンドを追加することです。
この失敗の主な理由は、ユーザーが一般ユーザーとしてログインしているためです。at
デフォルトでは、ルートのみアクセスできます。これを変更する必要がある場合は、atとmanページを見てください。
/var/at/at.allow allow permission control
/var/at/at.deny deny permission control
しかし - もう一度 - してください - しないでください:-)
他のすべての方法が失敗した場合...
他のすべての方法が失敗した場合は、質問を書き直してください。スケジュールツールの実行今問題の根本的な原因ではありません。上記が十分でない場合は、さらに詳しく見てください。