商用PCを使用して、24時間を通してバックグラウンドでいくつかのタスクを実行しようとしています。
基本的には、次のようなコマンドが必要です。
add-task *insert command here*
list-tasks
remove-task(s)
追加されたジョブは単にキューに入れられ、バックグラウンドで1つずつ実行する必要があります(シェルを終了した後も続行します)。
これを行うための簡単なスクリプト/プログラムはありますか?
答え1
lpd
別の解決策は、ジョブを実行するカスタム「印刷ドライバ」を使用して作成することです。同様の要求を受けたときに友人が助けてくれました。このようなスクリプトを作成して、次の場所に配置します/tmp/batch.sh
。
#!/bin/bash
TMPFILE=$(mktemp /tmp/XXXX)
exec <"$6"
cat - > $TMPFILE
chmod a+x $TMPFILE
$TMPFILE
rm -f $TMPFILE
次に、次を実行します。
lpadmin -p batch1 -E -P /tmp/batch.sh
これにより、キューが開始され、バッチ1以外の名前を使用してより多くのキューを作成できます。タスクを追加:
lp -d batch1 /path/to/jobscript
lpq
、およびを使用してlprm
ジョブを管理しますlpstat
。パラメータを操作に柔軟に渡すには、バッチ.shスクリプトをよりエレガントにすることができます。
(batch
このパスに行く前に試しましたが、OSXでキューとして機能していないか、間違って使用しています。)
答え2
標準がありますbatch
このコマンドは必要に応じて実行されます。より正確には、batch
システム負荷が高すぎない(したがって並列化を実行しない)場合、ジョブは一度に1つずつ実行されます。このbatch
コマンドはパッケージの一部ですat
。
echo 'command1 --foo=bar' | batch
echo 'command2 "$(wibble)"' | batch
at -q b -l # on many OSes, a slightly shorter synonym is: atq -q b
at -q b -r 1234 # Unschedule a pending task (atq gives the task ID)
答え3
この質問を認識してから数年が経過したため、元のポスターには役に立たないかもしれませんが、他の人には役に立つかもしれません。
まず、「作業スプーラ」が答えです。非常に強力で、ほとんどのLinuxディストリビューションとHomebrewにこの機能があります。
しかし、私が使用する多くのサーバーでは、任意のパッケージを簡単にインストールできないため、理想的には純粋なbash(またはPerlなど)が必要です。
しばらく苦労して、これまでうまく機能しているように見える純粋なbashの実装について考えました。以下で見つけることができます:https://github.com/sitaramc/notes/blob/master/bqと文書。
bashスクリプトなのでインストールが簡単です。ただし、2番目と3番目の要件を満たしています(ただし実装も簡単でなければなりません)。
スクリプトには多数のコメントが含まれており、必要に応じて数分で確認できます。
答え4
キューシステムは多いが、一般に非常に専門化されている。
あなたは調査することができますat
スケジューラ。ある意味では似ていますcron
が、繰り返し操作のためのキューではなく、ワンタイム操作のためのキューのように設定されています。システムのロードや作業順序など、時間以外の基準に基づいてトランザクションを「予約」できます。
あなたのお気に入りのディストリビューションにはそれに合ったパッケージがあることはほぼ確実です。