web-dev-qa-db-ja.com

スクリプトがcronによって再び開始されるまで、特定の時間にスクリプトを停止する方法は?

OSMC(Debianベース)を実行しているRaspberry Piを持っています。

午前0時にスクリプトsync.shを開始するようにcronジョブを設定しました。

0 0 * * * /usr/local/bin sync.sh

午前7時にスクリプトを停止する必要があります。現在私は使用しています:

0 7 * * * shutdown -r now

もっと良い方法はありますか?再起動はやり過ぎだと思います。

ありがとう

12
Anthony

timeoutコマンド で実行できます。

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

PS。同期プロセスに時間がかかりすぎる場合は、データを同期するための別のアプローチを検討してください。

25
Rabin

休止状態が17時間続いても同期を簡単に続行できる場合は、

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

同期が最初から再開したい場合は、

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

同期またはそのサブタスクが信号を無視するが残骸は残さない場合は、

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallpsmisc

9
Roman Czyborra

また、cronを使用して、指定した時間にサービスまたはスクリプトを「停止」または「強制終了」します。
最初にcronジョブを作成して、ジョブまたはスクリプトを実行します。 (Sudo pkill wgetという名前のジョブを強制終了する別のcronを簡単に実行できます)

次に、実行中のcrontabタスクを、便利で読みやすい形式で、次の出力に表示します。

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

これらは次のような最初の行に表示されます。

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

最初の列はPID、2番目はセッションID、3番目はcronによって開始されるコマンドです。セッションIDを使用して、特定のcronタスクに関連するすべてのプロセスを強制終了できるため、上記の例では、セッションID 4289を強制終了する必要があります。

   pkill -s 4289

スクリプトにpkillを入れ、これをcronとして実行する必要があります

4
ddlingo