
私はクライアントシステムで5分ごと、そして1分ごとにログをポーリングし、他のアプリケーションが外部ファイルを介して保存してアクセスできるように、いくつかのタイミング情報を抽出するいくつかのシェルスクリプトを設定しています。現在の実装では、2つの別々のファイルに1行を書き込むので、うまく機能します。プロセスを改善しているので、1つのファイルに5分ごとに2行を書き、もう1つのファイルに4分の1行を書き込む必要があります。しかし、テストでは、数分ごとに行が順番に実行されないことがわかりました。
私のスクリプトは次のとおりです。
*/5 * * * * ~/myscript.pl ~/mylog | tail -3 | head -1 > ~/myreport1
*/5 * * * * ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport1
* * * * * ~/myscript.pl ~/mylog | tail -8 | head -1 > ~/myreport2
* * * * * ~/myscript.pl ~/mylog | tail -7 | head -1 >> ~/myreport2
* * * * * ~/myscript.pl ~/mylog | tail -3 | head -1 >> ~/myreport2
* * * * * ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport2
場合によっては、数行だけが正しく実行されているように見え、他の場合は1行だけが記録されます。ファイルに書き込まれた行の総数を確認し続けることはありません。それ以外の場合は、抽出する値が正しく収集されないと仮定します。すべてのcron行が実行されているかどうかを確認する方法と、これらの行が順番に発生しないか、まったく実行されない原因になる可能性があるかはわかりません。
答え1
cron が cronfile に現れる順序でジョブを実行するという保証はありません。実際には、2つのタスクを同時に実行する可能性が高いです。したがって、仕事を互いに依存させることは決して良い考えではありません。たとえば、cronfileでは、1つのジョブがファイルを作成し、別のジョブ(または3つ)をそのファイルに追加します。アペンダーが最初に起動すると、作成者はアペンダーの操作を効果的に削除します。
より良いアプローチは、1分ごとに4回実行されるドライバスクリプトmyscript
と5分ごとに2回実行される別のドライバスクリプトを作成することです。その後、時間間隔ごとに1つのcronジョブのみを実行するように、両方のドライバスクリプトをcronできます。
答え2
cronの場合、同時に実行されるコマンドがたくさんあります。 Cronは、「並列に」実行される複数のサブプロセスを生成します。つまり、何らかの方法でマルチタスク/スケジューリングされ、ユースケースでデータ競合が発生します。
問題の場合、実際にcronは必要ありません。次の単純なシェルスクリプトで十分です。
#!/bin/sh
function f1() {
~/myscript.pl ~/mylog | tail -3 | head -1 > ~/myreport1
~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport1
}
function f2() {
~/myscript.pl ~/mylog | tail -8 | head -1 > ~/myreport2
~/myscript.pl ~/mylog | tail -7 | head -1 >> ~/myreport2
~/myscript.pl ~/mylog | tail -3 | head -1 >> ~/myreport2
~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport2
}
while true; do
f1
f2
sleep 1
f2
sleep 1
f2
sleep 1
f2
sleep 1
f2
sleep 1
done
これですべてが定義されました。つまり、実行順序が保証されます。
at
- またはセッション内で呼び出して(バックグラウンドジョブとして)起動することもできますscreen
。