次のように、プロセスがバックグラウンドに配置され、完了したときに通知を受けずにバックグラウンドでプロセスを開始するためにこれを使用できることがわかります。
(コマンド &) &> /dev/null
ただし、これにより、プロセスが完了したときにキャプチャされたオプションが削除されます(trap child_done CHLD
)。
どのように両方を持つことができますか?
答え1
ジョブスプーラあなたに役立つかもしれません。
のように新鮮な肉ネットワーク:
ジョブスプーラは、スプールされたジョブが順番に実行されるUnixデプロイメントシステムです。いつでも実行するジョブの量を設定できます。各システムの各ユーザーには独自のジョブキューがあります。これらの操作は、すべてのシェル/プロセスの正しいコンテキスト(インキューコンテキスト)で実行され、その出力/結果を簡単に表示できます。コマンドが多くのRAMに依存し、多くのディスクを使用し、多くの出力を提供したり、何らかの理由ですべてのコマンドを同時に実行せずに維持したい場合に便利です。あなたのリソースは最大の効率を達成するために忙しく動いています。インターフェイスを介してスクリプトで簡単に使用できます。
タスクスプーラを使用して、次のタスクを実行できます。ダーバン、Ubuntuなどのディストリビューション。
これにより、ジョブキューを実行し、必要に応じてその出力にアクセスできます。
たとえば、
$ tsp sleep 5
0
$ tsp sleep 5
1
$ tsp
ID State Output E-Level Times(r/u/s) Command [run=1/1]
2 running /tmp/ts-out.ZWn6Le sleep 5
1 finished /tmp/ts-out.Fhlcle 0 5.00/0.00/0.01 sleep 5
バックグラウンドで多くのタスクを実行している場合は間違いなく役立ちます。
順番に実行するか、あらかじめ設定されたスロット数で実行できます。ジョブ間で依存関係を作成することもできます(実行タスク1〜しない限りタスク0正常に完了しました。)
答え2
両方で行う方法は次のとおりです{ba,z}sh
。
関数を使用すると、変数を使用せずに変数の状態を保存および復元するのに役立ちますzsh
。monitor
setopt local_options
# Run the command given by "$@" in the background
silent_background() {
if [[ -n $ZSH_VERSION ]]; then # zsh: https://superuser.com/a/1285272/365890
setopt local_options no_notify no_monitor
"$@" &
elif [[ -n $BASH_VERSION ]]; then # bash: https://stackoverflow.com/a/27340076/5353461
{ 2>&3 "$@"& } 3>&2 2>/dev/null
else # Unknownness - just background it
"$@" &
fi
}
使用方法:
trap 'echo child done' CHLD
silent_background sleep 1
予想されるメッセージが生成されますchild done
。
答え3
通知が送信されたため、コマンド出力のリダイレクトは重要ではないようです。シェルを通していつ働く非同期で始まります。より正確には関連するシェル関数です。職業管理。
この引用は、「Bashリファレンスマニュアル」、「作業制御」の章のセクション1に記載されています。
シェルはジョブを各パイプラインに関連付けます。これ
jobs
には、コマンドを使用して一覧表示できる現在実行中の作業テーブルがあります。 Bashがジョブを非同期的に開始すると、次の行が印刷されます。[1] 25647
ジョブのジョブ番号は1で、そのジョブに関連付けられているパイプラインの最後のプロセスのプロセスIDは25647であることを示します。単一パイプライン内のすべてのプロセスは同じタスクのメンバーです。 Bash はジョブ制御の基礎として JOB 抽象化を使用します。
シェルスクリプトはこの通知を表示しません。
$ cat test
#!/bin/bash
true & echo true
$ ./test
true
事実によると
ジッシュ
Zsh ドキュメントは、これらの通知に関する同様のガイドラインを提供します。man 1 zshmisc
「JOBS」セクションを参照してください。次の場合、通知は表示されません。職業管理障害がある。
監視装置(-中、クッシュ:-中)
ジョブ制御を許可します。対話型シェルのデフォルト値。
zsh_prompt % setopt no_monitor
zsh_prompt % true & echo true
true
zsh_prompt %
zsh_prompt %
吹く
Bashは常に例を挙げて表示されるようです[1] 25647
。たとえば、次の場合、最終通知は[1]+ Done true
表示されません。職業管理障害がある。
bash_prompt $ true & echo true
[1] 25647
true
bash_prompt $
[1]+ Done true
ジョブ制御が無効になっています。
bash_prompt $ set +m # disable job control
bash_prompt $ true & echo true
[1] 25685
bash_prompt $
bash_prompt $
結論として
無効になっているかどうかは不明です。職業管理通知を隠すのは良いですか?
リソース
man 1 zshmisc
、作業部分。- Zsh、モニター:
man 1 zshoptions
。 - Bashリファレンスマニュアル - ジョブ制御
- Bashリファレンスマニュアル - 組み込みセット
答え4
次の例をご覧ください。
trap 'echo "DONE"' 0
{ find /usr & } &> /dev/null
wait
良い結果。不要( )
:不要なサブシェルが作成されます。{ }
グループコマンドだけです。