という bash スクリプトがtesting
内に保存されています/usr/local/bin
。
macOS のターミナル ウィンドウで を実行しますsudo testing
。2 番目のターミナル ウィンドウで、プロセスのリストを生成します。
ps -axo tty,pid,ppid,args | { head -1; grep "bash\|testing" | grep -v grep; }
予想どおりに返されます:
TTY PID PPID ARGS
ttys000 73674 73673 -bash # login shell used to run sudo
ttys000 73701 73674 sudo testing # sudo process
ttys000 73702 73701 /bin/bash /usr/local/bin/testing # "testing" bash script being run by sudo
ttys001 3714 3713 -bash # second login shell used to generate this process list
ただし、最初のターミナルウィンドウ(その間 testing
プロセスがまだ実行中の場合、プロセス リストは次のようになります。
TTY PID PPID ARGS
?? 73701 1 sudo testing
?? 73702 73701 /bin/bash /usr/local/bin/testing
ttys001 3714 3713 -bash
予想どおり、最初のログイン シェルは終了し、2 番目のログイン シェルはまだ実行中です。ただし、sudo プロセスとそのフォークされた (現在は孤立した) 子であるtesting
スクリプトはまだ実行中です。
これは、ターミナル ウィンドウを閉じるのがルートではなくユーザーであり、ルート プロセスに影響を与えるのに必要な権限を持っていないことが原因であると思われます。これは正しいでしょうか? ここで何か基本的なことを見逃しているような気がします。ターミナル ウィンドウが閉じられたときにルート プロセスを終了できるようにする方法はありますか?