SSHセッションを閉じた後、実行したままにしておきたいコマンドを実行しています。 &
引数で開始しませんでしたが、バックグラウンドで配置しました(CTRL-z、bg
)。今、私は切断した後もそれを続けさせようとしています。それがdisown -h
の目的ですよね? disown -h
とdisown -h 1
を試しました(jobs
は私の仕事を#1として示しています)。
disown: job not found: -h
disown
が引数ではなく「-h」をジョブ仕様として使用するのはなぜですか?それが問題なら、私はzsh
にいます。
bash
、zsh
、および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
も参照してください。
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では使用できません。