ザイルズ説明する
nohupとdisownはどちらもSIGHUPを抑制すると言うことができますが、その方法は異なります。 nohupはプログラムが最初にシグナルを無視するようにします(プログラムはそれを変更できます)。nohupはまた、制御端末なしでプログラムを予約しようとします。、端末が閉じたときにカーネルがSIGHUPを送信しないようにします。 disownは純粋にシェルの内側にあり、SIGHUPを送信せずにシェルを終了します。
$ nohup sleep 100 &
[1] 7882
nohup: ignoring input and appending output to 'nohup.out'
$ get-terminal-info-of-a-process.sh 7882
COMMAND CMD TT PID PPID CGNAME CGROUP PGID TPGID SESS SESSION OWNER
sleep 100 sleep 100 pts/5 7882 6780 systemd:/user.slice/user-10 7:pids:/user.slice/user-100 7882 7885 6780 c2 1000
$ tty
/dev/pts/5
edプロセスはnohup
まだ呼び出すシェルと同じttyを持ちます/dev/pts/5
。それで、Gillesは「nohupは、端末が閉じられたときにカーネルがSIGHUPを送信しないように端末を制御せずにプログラムを予約しようとします」という意味は何ですか?
彼の言葉が本当なら、どのようにnohup
Linux APIまたはシステムコール機能を介して制御端末からプログラムを分離できますか?
ありがとうございます。
答え1
私は順番に、説明する、実行中のプロセスはnohup
まだログインセッションと制御端末に関連付けられています。結局、そうでなかったら体操には意味がないでしょう。制御端子停止を無視。
nohup
ターゲットプログラムをチェーンロードする前に、標準出力をリダイレクトし、ブレーク信号を無視する2つのタスクを実行する単純なチェーンローダです。
これはnohup
FreeBSDのコード、NetBSDから、OpenBSDからとTENEX Cケースで。ご覧のとおり、セッション操作や端末制御はありません。