web-dev-qa-db-ja.com

特定の画面セッション内でcrontabコマンドを起動するにはどうすればよいですか?

私はこのように実行されるcrontabを持っています:

0 0 * * * /execute/Shell/script.sh
0 0 * * * /execute/Shell/script1.sh
0 0 * * * /execute/Shell/script2.sh

そして、各スクリプトを異なる画面で起動したいと思います。ただし、これらのスクリプトのいずれかの進行状況を確認したいときはいつでもscreen -d -r <PID>を実行するだけで、進行状況を確認できるように画面を再接続できるように、その画面を実行し続けたいと思います。

これを行う方法があるに違いないと確信しています。しかし、私が見つけた同様の質問はそれに答えていません。

crontabで画面を開始crontabを使用して画面セッションを開始するにはどうすればよいですか?

3
Hunle

あなたはこのようなことを試みるかもしれません:

cat /etc/cron.d/test
*/10 * * * * root screen -dmS script bash -c '/execute/Shell/script.sh; exec bash'
*/10 * * * * root screen -dmS script1 bash -c '/execute/Shell/script1.sh; exec bash'
*/10 * * * * root screen -dmS script2 bash -c '/execute/Shell/script2.sh; exec bash'

それは私が信じているように動作するはずです。確かに、必要に応じて時間を編集してください。

2
Jaroslav Kucera

実際にコマンドを操作する必要がありますか、それともコマンドが完了して結果がメールで返送される前にステータスを確認したいだけですか?

同様の「問題」が発生しました。接続を監視するために、cron内から traceroute(8) および mtr を実行していました。 mtrforループで実行して、特定の間隔(5〜16.67分(300〜1000サイクル))でより正確な測定を提供しますが、スクリプト全体は約1時間(電子メールでスパムされないようにするため)なので、発生したステータスを確認できるようにしたかったのです。

https://unix.stackexchange.com/questions/61820/how-can-i-access-a-deleted-open-file-on-linux-output-of-a-running-crontab-task

cron が機能する方法は、/ tmpに一時ファイルを作成し、すぐに unlink(2) を呼び出すことです(ただし、ファイルは開いたままにします) );これはその後、スクリプトが終了する前にスクリプトの出力を保存するために使用され、電子メールで送信されます。

そのため、lsof -n -c cron(および/またはlsof -n | fgrep cron)を使用して、削除された開いているファイルの数を確認し、/proc/$PID/fd/$FD名前空間を介してそれらのファイルにアクセスして screen を必要とせずに、cron内から実行されるスクリプトの出力。

2
cnst

上記(Jaroslav Kuceraの回答)は、2回目の呼び出しで、コマンドが前の画面セッションと同じ名前の新しい画面セッションを生成するため、意図したとおりに機能しません。

同じスクリプトに対して常に同じ画面セッションを使用したい場合は、もう少し注意が必要です。

@reboot cronでこれらのセッションを実行し、次のような一定のループを作成するスクリプトを使用します。

#!/bin/bash
while true; do
if [ -f /tmp/script1_enabled ]; then
    script1_function_or_command
    rm /tmp/script1_enabled
fi

sleep 60;
done 

/ tmp内の名前付きファイルの存在を確認するために毎分実行されます-存在する場合はコマンドを実行し、そうでない場合はさらに1分待ちます。

2番目の部分は、これらのファイルを毎日作成するcronコマンドです。ブールフラグのように機能して、スクリプトの呼び出しを開始します。

スクリプトが完了すると、ファイルは削除されます。そうすれば、スクリプトに対して同じセッションを維持しながら、好みの間隔で実行することができます。

ループの60秒の遅延が大きすぎる場合(スリープは予測できない時間に実行されるため、このメソッドを使用して特定の時間にスクリプトを正確に実行する方法はありません)、次のように設定できますinotifywaitファイルが作成されるとすぐにスクリプトを監視して実行します。

cronは次のようになります。

@reboot screen -dmS script1 /usr/local/bin/script1_watcher
@reboot screen -dmS script2 /usr/local/bin/script2_watcher
0 0 * * * touch /tmp/script1_enabled
15 */4 * * * touch /tmp/script2_enabled
1
bocian85