batch
デーモンに付属のツールは、atd
原則として、システム使用率が特定のレベル(デフォルトでは1.5)未満に低下した場合にのみコマンドを実行するのに役立ちます。しかし、それを使用することはat
現代の標準に従って非常に見苦しいです。で実行できるスクリプトを提供するか、/bin/sh
完了、カラーコーディングなどなしで、メインプロンプトでインタラクティブにコマンドを入力する必要があります。
本当に良いことは、nice
コマンドの前に配置してバッチキューに追加できるコマンドプレフィックスツールです(at
私の質問の焦点ではありませんが、同様のユーティリティが役に立ちます)。 。たとえば、次のように動作します。
my-batchifying-command python some_longrunning_computational_script.py
そんなことがありますか?そうでなければ、どのように作成されましたか?私はこれをzsh
メインシェルに使用しますが、bash
答えは同じようにうまく機能し、より広い適用範囲を持つことができます。
答え1
zsh
単純なコマンドの場合:
my-batch() {print -r -- ${(qq)@} | batch}
my-batch python some_longrunning_computational_script.sh
そうするでしょう。
ループやリダイレクトなど、より複雑なものが必要な場合は、次のことができます。
my-batch eval 'for i in ...; done'
my-batch eval 'echo test > /some/file'
しかし、構文sh
ではなく使用法を覚えてくださいzsh
。
これを防ぐには、eval
次のトリックを使用できます。
alias my-batch=':||'
preexec()
if [[ $1 = my-batch\ * ]]; then
print -r -- "${1#my-batch }" | batch
fi
今回も構文を使用する必要がありますsh
。
のみ可能なので参考にしてください一つコマンド(実際にはパイプ)です。中かっこが複数必要な場合は、中かっこを使用してください。
my-batch { ls > /tmp/a; date > /tmp/b; }
上記のアイデアは、my-batch
コマンドが何も実行せず、コマンドの引数も評価しないことです(たとえば、my-batch echo $(date)
拡張されています):|| echo $(date)
。preexec
タスクを実行するためにコマンドラインが承認されるたびに、コマンドが実行されます。
の場合、preexec
コマンド$1
ライン全体は変更されません。で始まっていることを確認して削除し、"my-batch "
残りをに送信しますbatch
。
my-batch
これが行の先頭にあるべき理由を説明します。たとえば、うまくいかず、実際には解釈されているため、cmd && my-batch ...
そのようなことはできません。my-batch foo || bar
:|| foo || bar