バックグラウンドで自動的に作業を開始

バックグラウンドで自動的に作業を開始

次のように、プロセスがバックグラウンドに配置され、完了したときに通知を受けずにバックグラウンドでプロセスを開始するためにこれを使用できることがわかります。

(コマンド &) &> /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

関数を使用すると、変数を使用せずに変数の状態を保存および復元するのに役立ちますzshmonitorsetopt 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 $

結論として

無効になっているかどうかは不明です。職業管理通知を隠すのは良いですか?

リソース

答え4

次の例をご覧ください。

trap 'echo "DONE"' 0
{ find /usr & } &> /dev/null
wait

良い結果。不要( ):不要なサブシェルが作成されます。{ }グループコマンドだけです。

関連情報