
UNIXは、特定の時間に定期的に開始されるキューを作成し、その時間に順次実行されるキューにいくつかのタスクを徐々に追加する方法を提供しますか?
私はcron
と知っていますがat
、
cron
キューシステムがありません。at
順次タスクはサポートされていないようで、タスクリストは非常に不親切にリストされています。 (「すべてリスト」はジョブ番号と日付のみを出力し、単一ジョブに関する情報はジョブ全体を出力しますenv
。)
私は次のことを想像しています。
$ create queue a at midnight
$ add "ffmpeg -i a.mkv a.mp4" to a
$ add "ffmpeg -i b.mkv b.mp4" to a
$ add "ffmpeg -i c.mkv c.mp4" to a
$ create queue b at noon
$ add "mysqldump ..." to b
$ list queue a
RUNNING ffmpeg -i b.mkv b.mp4
NEXT ffmpeg -i c.mkv c.mp4
$ mail
>N 1 Task Daemon Thu Sep 1 00:23 <user@localhost> ffmpeg -i a.mkv a.mp4
ちなみに実際に必要なのは、夜にCPU/時間がかかる作業をスケジュールすることです。このとき、ノートパソコンはドアが閉まっている部屋でファンの音が聞こえません(またはCPUが沸騰する熱を感じることはできません)。
答え1
非難することもありますがat
、使用すると所望の効果をある程度得ることができます。一括特徴。at
コマンドにキューに単一の大文字名を指定すると、そのキュー内-q M
のすべてのコマンドは要求された時間にのみ実行されます。もしシステム負荷が0.8未満の場合、ジョブの開始間に60秒の間隔があります。
-l
-b
オプションとデーモンを使用してロードと間隔を変更できますatd
。ジョブはサブミット順に実行され、atq -q M
指定されたキューのジョブのみがリストされます。
答え2
CronとatはUnixシステムに通常インストールされる唯一のものです。しかし、愛好家がたくさんいます。ジョブスケジューリングシステムそこに。ジョブをキューに追加する標準インターフェースがあります。qsub
。次の深夜にタスクをスケジュールするには、次の手順に従います。
{ echo '#!/bin/sh'; echo 'ffmpeg -i a.mkv a.mp4'; } >a.script
qsub -a $(date -d 'tomorrow 0:00' +%Y%m%d%H%M) a.script
Ubuntuには、POSIX(NQS派生)インターフェイスを実装する2つのタスクスケジューラが含まれています。トルクそして泥。他のオープンソース実装があり、1つを選択するための特別なアドバイスはありません。
答え3
これが(定期的なジョブではなく)単一の実行ジョブの場合、最も簡単な方法はおよびをtmux
使用することですsleep
。 tmuxセッションを開き、次の操作を行います。
$ echo "ffmpeg -i a.mkv a.mp4" > midnight.sh
$ echo "ffmpeg -i b.mkv b.mp4" >> midnight.sh
$ let secs_till_midnight=$(date -d "`date -d '+1 day' +%F`" +%s)-$(date +%s)
$ sleep $secs_till_midnight && sh midnight.sh
同じセッションの新しいウィンドウ/ウィンドウでより多くのタスクをスケジュールし、完了したらセッションから切り離します。それだけです!自分だけの自家製スケジューラ!
midnight.sh
実行中のジョブをリストできない場合でも、可視性を高めるために、最初に次の2行を追加できます。
set -x
exec 2>midnight_err >midnight_out
各コマンドは実行前に端末に出力され、そのコマンドのすべての出力はファイルにmidnight_*
リダイレクトされます。
さて、そのセッションまたはtail
ログファイルに追加してステータスを確認してください!