web-dev-qa-db-ja.com

Disownは-hオプションを取りません

SSHセッションを閉じた後、実行したままにしておきたいコマンドを実行しています。 &引数で開始しませんでしたが、バックグラウンドで配置しました(CTRL-zbg)。今、私は切断した後もそれを続けさせようとしています。それがdisown -hの目的ですよね? disown -hdisown -h 1を試しました(jobsは私の仕事を#1として示しています)。

disown: job not found: -h

disownが引数ではなく「-h」をジョブ仕様として使用するのはなぜですか?それが問題なら、私はzshにいます。

6
Coderer

bashzsh、およびksh93は、disownコマンドを持つシェルです。 3つのうち、bashオプションをサポートするのはhだけです。 -hがない場合は、zshの動作(ジョブテーブルから削除)をエミュレートし、-hがある場合は、ksh93の動作をエミュレートします(終了時にSIGHUPを送信しませんが、送信しません) bgまたはfgを実行するか、強制終了できるように、ジョブテーブルから削除しないでください。

次のようにして、zshでその動作をエミュレートできます。

typeset -A Nohup
trap 'disown %${(k)^Nohup}' EXIT
trap 'for i (${(k)Nohup}) (($+jobstate[i])) || unset "Nohup[$i]"' CHLD

したがって、Nohup連想配列は、終了時にSIGHUPが送信されないジョブのリストを保持します。したがって、disown -h %1の代わりに、Nohup[1]=と記述します。

終了時にSIGHUPをジョブに送信しないようにするには、setopt Nohupも参照してください。

6

disownだけで、切断後もプログラムを実行し続けることができます。

$ command_running_forever
^Z
zsh: suspended  command_running_forever
$ bg
[1]  + continued  command_running_forever
$ jobs
[1]  + running    command_running_forever
$ disown %1
$ logout

disown -hはbash引数を使用します。これにより、ジョブはジョブテーブルに残り、bashがSIGHUPを受信したときにSIGHUPを受信しません(bashのhelp disown)。この引数はzshでは使用できません。

4
mrb