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


96

bashからzshに切り替えたところです。

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

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

これがデフォルトの動作として私が望むものです。

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

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

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

回答:


168

次のコマンドでプログラムを開始し&!ます。

dolphin &!

&!または等価的に、&|)の両方へのzsh固有のショートカットである背景 否認シェルを出ることは実行のままになるように、プロセス。


2
完全を期すために、すでに開始された後に勘当する方法をリストすることもできますか?
trusktr


私はこのソリューションが好きで、個々のコマンドに実装しますが、Zshのデフォルトの動作を変更する方法をまだ探しています。
ヴィンス

1
@Vinceデフォルトを変更して、バックグラウンドプロセスを常に勘当するという意味ですか?もしそうなら、あなたはあなたのでそれを行うことができsetopt nohupます~/.zshrc。次に、バックグラウンドでコマンドを開始する&と、常にそれが否認されます。ただし、デフォルトでは、終了しようとすると、zshはジョブを実行していることを通知します。でオフにすることもできますsetopt nocheckjobs
あんこ

@Anko私setopt nocheckjobsがやりたいことをやってくれると思います。今、私はで利用可能なオプションを見つけましたman zshoptions。警告をオフにしたいのですが。バックグラウンドプロセスがあるときは知っていますが、それは必要ありません。で開始しない限り、バックグラウンドプロセスを閉じたいのnohupですが。私は現在、これをバックグラウンドでPyCharmを実行するシェル関数で使用していますnohup。入力するpycharm .と実行されnohup charm $@ &ます。ターミナルを閉じても閉じませんが、それでも警告が表示され、exit2回入力する必要があります。
ヴィンス

59

zshドキュメントから:

HUP

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

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

% setopt NO_HUP

警告が必要ない場合は、はい。
Carl Norum 2013年

30

私はの組み合わせを使用していることを発見したnohup&disown私はへの恒久的シェルが終了したときに実行するジョブ原因たくないとして、私のために動作します。

nohup <command> & disown

ちょうどながら&に私のために働いておりbash、私はのみ使用する場合に見つかったnohup&またはdisownシェルが終了したときにコマンドを実行するには、Javaの実行コマンドを呼び出すスクリプトのように、プロセスはまだ停止します。

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

私はこのページnohupdisown情報を見つけました、そしてこのSO回答の情報。&


5

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

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

screen -S myScreenName

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

3)画面セッションを終了(デタッチ)します

screen -d

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


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

screen -r myScreenName

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

screen -ls

このソリューションは、bash、zshなどのすべてのターミナルインタープリターで機能します。関連項目 man screen


MacOSユーザーへの注意点として、画面から切り離すためのキーボードショートカットはControl + A、次にDでした。また、プロセスを実行したままstdoutに譲り、screen -dと書くと、これが唯一の選択肢でした。
ビショイ

素晴らしいですが、特にZSHを終了するときにbgタスクを実行し続ける方法に関するQとは関係ありません。
RichieHH
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.