回答:
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)
別の解決策は、を使用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
これによりキューが開始され、batch1の代わりに他の名前を使用してさらにキューを作成できます。以下を使用してジョブを追加します。
lp -d batch1 /path/to/jobscript
ジョブを管理するlpq
、lprm
とlpstat
。ジョブに引数を渡す際の柔軟性を高めたい場合は、batch.shスクリプトをより洗練されたものにすることができます。
(batch
このルートをたどる前に試しましたが、OSXのキューとして機能しないか、間違って使用していました。)
batch
。
この質問は数年前のものなので、元のポスターには役に立たないかもしれませんが、他の人には役立つかもしれません。
まず、「タスクスプーラ」が答えです。それはかなり強力で、Fedoraは少なくともそれを持っています。
しかし、私が使用する多くのサーバーでは、手間をかけずに任意のパッケージをインストールすることはできないため、理想的には純粋なbash(またはperlなど)が必要です。
これにしばらく苦労した後、私は今のところうまく機能しているように見える純粋なbashの実装を思いつきました。https://github.com/sitaramc/bqで見つけることができます。
これは1つのbashスクリプトなので、インストールは簡単です。ただし、2番目と3番目の要件がパントされます(ただし、これらも実装するのは簡単です)。
スクリプトは自由にコメントされ、必要に応じて数分で確認できます。
batch
コマンドが「並列化を行わない」と言うのは間違っています。通常、あるジョブを開始してから次のジョブを開始するまでには、デフォルトの60秒の遅延があります。ただし、最初のジョブが完了するまで次のジョブを待機させるものは何もありません。オプションでatd
設定された値-b
が経過するとすぐに、バッチキューからジョブを開始します(atd
manページを参照)。