後で実行するコマンドを便利にスケジュールしますか?


87

たとえば、今から8時間後にコマンドを実行する簡単な方法は何ですか?私はこのように考えることができます:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

もっと適切な方法はありますか?


nohup+ に何か問題がありsleepますか?なぜ「不適切」なのですか?
cprn

回答:


123

このatコマンドを使用できます。at後でコマンドを実行します。atユーティリティは、後で実行するために、AT-ジョブとして一緒にそれらを標準入力からコマンドを読み取り、グループなければなりません。

通常、atUbuntuではデフォルトでインストールされますが、リリースに含まれていない場合は、次の方法でインストールします。

sudo apt-get install at

詳細、オプション、例などについては、Ubuntu Manpage Repositoryを参照してください

例:

at now +8 hours -f ~/myscript.sh

また同様に、便利な速記を使用することができるtomorrownoonのように、

echo "tweet fore" | at teatime 

警告:これにより、パイプの左側でコマンドがすぐに実行されますが、出力は後でのみ表示されます。この例は、アクションをにパイプする方法も示していますatat -c以下のように、スケジュールされたアクションを調べることができる方法です。

at -c 3

19
元のポスターの質問をより具体的に扱う簡単な使用例を追加すると役立つ場合があります。たとえばat now +8 hours -f ~/myscript.sh
steeldriver

6
さらにat 8:00、絶対時間にコマンドを実行する必要がありbatch、「コンピューターがアイドル状態になっているように見える場合」
サイモンリヒター

4
誰かが疑問に思っていた場合teatime、午後4時です。いくつかの理由から、それはで言及していないmanpages.ubuntu.com/manpages/raring/man1/at.1posix.htmlが、それはでありman at、ここでmanpages.ubuntu.com/manpages/raring/en/man1/at.1.html
ダン

3
たぶん、「at」ユーティリティはデフォルトではインストールされておらず、他の誰かがそれを入手したい場合は、単に「at」パッケージをインストールします。編集:とにかく、答えを編集しただけです(マンページのリンクも修正しました)。
heartsmagic 14

4
atにパイプするとすぐにコマンドが実行され、出力のみがスケジュールされることに注意してください。スケジュールを設定したかったのでgpio write 8 1すぐに実行できたため、4時間の3D印刷が失敗しました。
マチェイSwic

8

はい、cronジョブを設定できます。

たとえば、現在の時刻が14:39:00で、今日が8月30日の金曜日である場合、次のcronジョブ(8時間後に実行される)をcrontab -eコマンドを使用してcrontabファイルに追加できます。

39 22 30 8 5  /path/to/mycommand.sh

詳細:


3
はい、はい、私はCronの仕事について知っていると言っておくべきでした。これはさらに厄介です。なぜなら、それはcrontabの中に無期限に座っているからですよね?
スティーブベネット

4
@RaduRădeanu:cronを持つ、(金曜日の8月のoccuringの別の30日があるとき)、それは数年後に再び火ができることを注意してください...
オリヴィエ・デュラック

2
これは巧妙なハックです。ただし、「at」ははるかに優れた方法です。14:39にコンピューターの電源をオフにするとどうなりますか?
エモリー

1
エラーはまだ私のポイントではありません。私が言いたいのは、あなたが入力したテキストは、イベントの後も文字通りあなたのcrontabに残ったままであり、別のクリーンアップタスクを作成するということです。
スティーブベネット

2
@SteveBennettはい、あなたは正しいです。コマンドは、crontab削除するまで自分の中に残ります。一年後、誰がそこにそれを置いたのか、そしてなぜそれを忘れたとき、あなたはコマンドをどうするか疑問に思うようになります。
水田ランダウ

8

以下のためのGnomeベースのGUIを使用してcronatなどが挙げられます:

CronHowtoの紹介では、gnome-scheduleGUI を使用することをお勧めします。これは、端末にすべてのゴミを入力するよりもはるかに優れています(特に、「パワー」* nix / bsdユーザーではない「平均」Ubuntuユーザーの場合)。

Unity Dash(または他のアプリケーションメニュー)を使用して実行し、Scheduled Tasksまたはrunning を探しますgnome-schedule

GnomeベースのUbuntuシステムでは、アプリケーションのGnomeスケジュールタスクツール(gnome-scheduleパッケージから)-> System Toolsは、Cronの使用を促すグラフィカルインターフェイスを提供します。プロジェクトのWebサイトはhttp://gnome-schedule.sourceforge.net/にあります。ソフトウェアは、ソフトウェアセンターから、または次のように入力してインストールできます。

sudo apt-get install gnome-schedule

ターミナルで。

を使用してgnome-schedule、ホームディレクトリのスクリプトに、このタイプのウィンドウを使用して新しい「at」コマンドを設定します。

ここに画像の説明を入力してください


5

私はそれが事であることを知る前に、これを行うための迅速で汚い方法を見つけましたat

スクリプトを正午に実行するとします。

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

明日正午に実行したいとします(今日は11月24日です)。

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

更新:やや良い方法:を使用して、気になる数字のみをテストしますdate +FORMAT

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...

10
この答えをupvotedてきた二人に、使用してくださいatcronまたは任意の他の実スケジューラアプリケーション。タスクのスケジューリングは難しく、再発明すべきではありません。
dimo414

1
@ dimo414私の方法の何が問題になっていますか?
wjandrea

8
少なくとも、それはビジー待機であり、これは無駄です。さらに悪いことに、それは正しいことが保証されていません。条件式を見逃すことは(ありそうもないとしても)完全に可能です。正規表現に基づいてスケジューラを作成することも、エラーが発生しやすくなります。十分機能するかもしれませんが、に比べて利点はありませんat
dimo414

(脇:私はあなたの答えをdownvoteしていない、私はちょうど人々がそれを使用すべきとは思わない)
dimo414

4
使用するもう1つの理由atは、ジョブが再起動後も存続するためです。
マナトワーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.