web-dev-qa-db-ja.com

毎日特定の時間にUnixのバックグラウンドでシェルスクリプトを実行する

毎日特定の時間にUnixのバックグラウンドで実行する必要があるシェルスクリプトtask.shがあります。

Nohupがスクリプトをバックグラウンドで実行するのに役立つことは知っています。しかし、このスクリプトを毎日指定された時間に実行するようにスケジュールする方法について心配しています。

注:私はrootユーザーではありません。 crontabコマンドの権限がありません。

どんな助けでも大歓迎です。

2
learner1

これを行う正しい方法は、Crontabを使用することです-crontabにアクセスできない場合は、実際に管理者に相談する必要があります-おそらく、スケジュールされたジョブを実行することを望まないでしょう。とはいえ、crontabコマンドの権限がないと言う前に、「crontab -e」を実行してみてください。各ユーザーは独自のcronファイルを持っており、crontabは自分のファイルを編集しようとします。 (ユーザーとしてcrontabを単独で実行すると、フリーズするだけです)

ジョブに「&」文字を追加することで、ほとんどすべてのジョブをバックグラウンドで実行できます。これに反対することをお勧めしますが、whileループでスクリプトを記述して、時間をチェックし、1分待ってから、もう一度チェックし、一致する場合はコマンドを実行することができます。このスクリプトは&を使用して実行し、バックグラウンドで実行できます。また、システムを破壊するためにトラブルに巻き込まれる可能性があります。

検索するもう1つのコマンドは、「画面」です。これにより、端末をコンソールに接続したり、コンソールから切り離したりできます。これは、バックグラウンドで何かを実行するのに便利な方法ですが、それを表示して操作することはできます(スクリーニングしてから、フォアグラウンドでプログラムを実行してから、切り離すことができます)。画面から、後で再接続します)

[〜#〜]編集[〜#〜]

1分に1回時間をチェックし、適切な時間にコマンドを実行するスクリプト:

#! /bin/bash

RUNAT="07:54"

while [ 1 ]
do
    DATE=`/bin/date +%H:%M`
    if [ $DATE. = $RUNAT. ]
    then
        /path/to/script.sh
    fi

    sleep 60
done

これを(たとえば)mycron.sh、chmod 755 mycron.shとして保存して実行し、スクリプトを実行するときにトリガーするようにRUNAT行を変更してから、このスクリプトをmycron.shとして実行すると、バックグラウンドで実行されます。

このスクリプトは、コマンドを1日に1回だけ実行し、「チェーン自体」を実行しないため、スタックがオーバーフローすることはありません。

2
davidgo

atにアクセスできる場合(cronが利用できない場合は、試してみる価値はありません)、単純なcronジョブをエミュレートできます。これを行う最も簡単な方法は、make at指定された時間にスクリプトを実行し、スクリプトmake atを実行する必要があるときに再度実行することです。

私の例では、スクリプトは最後の実行のタイムスタンプのみを書き込み、1分のタイミングを実行します。

/tmp$ cat cronbyat.sh
#!/bin/sh


echo "last run: `date +%Y%m%d-%H%M%S`" >> /tmp/cronbyat.log

echo "/tmp/cronbyat.sh" | at now + 1 minute

/tmp$ echo "/tmp/cronbyat.sh" | at now + 1 minute
warning: commands will be executed using /bin/sh
job 5 at Mon Feb 15 09:00:00 2016
/tmp$ tail -f /tmp/cronbyat.log
last run: 20160215-090000
last run: 20160215-090100
last run: 20160215-090200
last run: 20160215-090301
last run: 20160215-090400
^C
/tmp$ atq
10      Mon Feb 15 09:05:00 2016 a lx
/tmp$ atrm 10
/tmp$ atq
/tmp$

スクリプトが不要になった場合は、最後の行に示すように、現在のジョブを強制終了する必要があります。残念ながら、何らかの理由で実行を逃した場合、チェーンは壊れます。したがって、何らかのフィードバックを提供して確認する必要があります。

1
Gombai Sándor