web-dev-qa-db-ja.com

zshを終了しますが、実行中のジョブは開いたままにしますか?

Bashからzshに切り替えました。

Bashでは、シェルが終了してもバックグラウンドタスクが実行され続けます。たとえば、dolphinexitの後に実行を続けます:

$ dolphin .
^Z
[1]+  Stopped                 dolphin .
$ bg
[1]+ dolphin . &
$ exit

これがデフォルトの動作として欲しいものです。

対照的に、zshの動作は、exitでのジョブの実行について警告し、exitを再度実行するとジョブを閉じます。たとえば、2番目のdolphin-コマンドが実際にシェルを終了すると、exitは閉じられます。

 % dolphin .
^Z
zsh: suspended  dolphin .
 % bg
[1]  + continued  dolphin .
 % exit
zsh: you have running jobs.
 % exit 

ここで、bashのようにzshのデフォルトの動作を作成するにはどうすればよいですか?

69
Owen_R

&!でプログラムを開始します。

dolphin &!

&!または同等に、&| )は、backgrounddisownプロセスを終了し、シェルを終了しても実行したままになるようにします。

111
Anko

zsh documentation から:

HUP

... zshでは、シェルの終了時にバックグラウンドジョブを実行している場合、シェルはそれを強制終了するものと見なします。この場合、SIGHUP...と呼ばれる特定の信号が送信されます。シェルが終了した場合でも継続するジョブを頻繁に開始する場合は、オプションNO_HUPとバックグラウンドジョブを設定できます。放置されます。

したがって、NO_HUPオプションを設定するだけです。

% setopt NO_HUP
54
Carl Norum

Nohup&、およびdisownは、シェルが終了したときにジョブを永続的に実行させたくないので、私にとっては有効です。

Nohup <command> & disown

ただ&bashで働いていましたが、Nohup&、またはdisownは、Java runコマンドを呼び出すスクリプトのように、実行中のコマンドではシェルが終了したときにプロセスが停止します。

  • Nohupは、コマンドがシェルからのNohupおよびSIGHUP信号を無視するようにします
  • &プロセスをサブターミナルのバックグラウンドで実行します
  • disownの後に引数(ジョブリスト内のジョブ番号のインデックス)が続くと、シェルはSIGHUPシグナルを子プロセスに送信しません。引数なしでdisownを使用すると、デフォルトで最新のジョブになります。

このページNohupおよびdisown情報を見つけ、&情報 this SO answer

23
ryanjdillon

通常、バックグラウンドジョブの実行を維持するためにscreenを使用します。

1)スクリーンセッションを作成します:

screen -S myScreenName

2)スクリプト、サービス、デーモンなどを起動します

)screen-session withを終了(デタッチ)

screen -d

またはショートカットALT+A then d


数百年後-セッションを再開する(再接続する)場合:

screen -r myScreenName

スクリーンセッションがあるかどうか、その名前とステータス(アタッチまたはデタッチ)を知りたい場合:

screen -ls

このソリューションは、bash、zshなどのすべての端末インタープリターで機能します。man screen

1
Aydin K.