はじめに
linuxでプロセスの仕組みが曖昧な部分があったため、
ターミナル上で実行したプロセスを終了しようとして、誤ってps -efコマンドのプロセスIDの隣に記載してある
ターミナルの親プロセスIDをkillしたらどうなるか検証してみました。
また、プロセス終了とnohupコマンドを試してみました。
ps -efコマンドについて以下の記事が詳細に記載されています。
参考にさせていただきました。
https://codezine.jp/unixdic/w/ps
https://atmarkit.itmedia.co.jp/ait/articles/1603/28/news022.html
対応した内容
ターミナルの親プロセスIDを停止してみた
Teratermに接続してsleepコマンドとyesコマンドを実行しました
[root@localhost ~]# yes > /dev/null &
[1] 1641
[root@localhost ~]#
[root@localhost ~]# yes > /dev/null &
[2] 1643
[root@localhost ~]# sleep 120 &
[3] 1670
sleepコマンドのプロセスを表示しました。
-e すべてのプロセスを表示
-f 起動時間も含めた詳細なフォーマットを表示
※TeraTermで起動したターミナル名 pts/0です。
grep --color=auto -e yes -e sleepはps -efコマンドのプロセスです。
ps -efコマンドを実行するごとにプロセスIDが変わります。
[root@localhost ~]# ps -ef | grep -e yes -e sleep
root 1641 1248 52 09:35 pts/0 00:06:41 yes
root 1643 1248 49 09:35 pts/0 00:06:05 yes
root 1670 1248 0 09:48 pts/0 00:00:00 sleep 120
root 1676 1248 0 09:48 pts/0 00:00:00 grep --color=auto -e yes -e sleep
親プロセスを表示させるためにps axfコマンドを実行してみた
1248のプロセスIDは、TeraTermのターミナルpts/0の親プロセスBashです。
[root@localhost ~]# ps axf
PID TTY STAT TIME COMMAND
2 ? S 0:00 [kthreadd]
4 ? S< 0:00 \_ [kworker/0:0H]
5 ? S 0:00 \_ [kworker/u2:0]
6 ? S 0:00 \_ [ksoftirqd/0]
7 ? S 0:00 \_ [migration/0]
8 ? S 0:00 \_ [rcu_bh]
9 ? R 0:00 \_ [rcu_sched]
10 ? S< 0:00 \_ [lru-add-drain]
11 ? S 0:00 \_ [watchdog/0]
13 ? S 0:00 \_ [kdevtmpfs]
14 ? S< 0:00 \_ [netns]
15 ? S 0:00 \_ [khungtaskd]
16 ? S< 0:00 \_ [writeback]
17 ? S< 0:00 \_ [kintegrityd]
18 ? S< 0:00 \_ [bioset]
19 ? S< 0:00 \_ [bioset]
20 ? S< 0:00 \_ [bioset]
21 ? S< 0:00 \_ [kblockd]
22 ? S< 0:00 \_ [md]
23 ? S< 0:00 \_ [edac-poller]
24 ? S< 0:00 \_ [watchdogd]
30 ? S 0:00 \_ [kswapd0]
31 ? SN 0:00 \_ [ksmd]
32 ? SN 0:00 \_ [khugepaged]
33 ? S< 0:00 \_ [crypto]
41 ? S< 0:00 \_ [kthrotld]
42 ? S 0:00 \_ [kworker/u2:1]
43 ? S< 0:00 \_ [kmpath_rdacd]
44 ? S< 0:00 \_ [kaluad]
45 ? S< 0:00 \_ [kpsmoused]
47 ? S< 0:00 \_ [ipv6_addrconf]
60 ? S< 0:00 \_ [deferwq]
96 ? S 0:00 \_ [kauditd]
97 ? S 0:04 \_ [kworker/0:3]
290 ? S< 0:00 \_ [ata_sff]
295 ? S 0:00 \_ [scsi_eh_0]
297 ? S< 0:00 \_ [scsi_tmf_0]
298 ? S 0:00 \_ [scsi_eh_1]
299 ? S< 0:00 \_ [scsi_tmf_1]
301 ? S 0:00 \_ [scsi_eh_2]
302 ? S< 0:00 \_ [scsi_tmf_2]
304 ? S 0:00 \_ [irq/18-vmwgfx]
305 ? S< 0:00 \_ [ttm_swap]
339 ? S< 0:00 \_ [kworker/0:1H]
380 ? S< 0:00 \_ [kdmflush]
381 ? S< 0:00 \_ [bioset]
390 ? S< 0:00 \_ [kdmflush]
391 ? S< 0:00 \_ [bioset]
404 ? S< 0:00 \_ [bioset]
405 ? S< 0:00 \_ [xfsalloc]
406 ? S< 0:00 \_ [xfs_mru_cache]
407 ? S< 0:00 \_ [xfs-buf/dm-0]
408 ? S< 0:00 \_ [xfs-data/dm-0]
409 ? S< 0:00 \_ [xfs-conv/dm-0]
410 ? S< 0:00 \_ [xfs-cil/dm-0]
411 ? S< 0:00 \_ [xfs-reclaim/dm-]
412 ? S< 0:00 \_ [xfs-log/dm-0]
413 ? S< 0:00 \_ [xfs-eofblocks/d]
414 ? S 0:00 \_ [xfsaild/dm-0]
585 ? S< 0:00 \_ [xfs-buf/sda1]
587 ? S< 0:00 \_ [xfs-data/sda1]
588 ? S< 0:00 \_ [xfs-conv/sda1]
592 ? S< 0:00 \_ [xfs-cil/sda1]
593 ? S< 0:00 \_ [xfs-reclaim/sda]
594 ? S< 0:00 \_ [xfs-log/sda1]
595 ? S< 0:00 \_ [xfs-eofblocks/s]
596 ? S 0:00 \_ [xfsaild/sda1]
1336 ? S 0:00 \_ [kworker/0:0]
1642 ? S 0:00 \_ [kworker/0:2]
1667 ? S 0:00 \_ [kworker/0:4]
1673 ? S 0:00 \_ [kworker/0:1]
1 ? Ss 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
491 ? Ss 0:00 /usr/lib/systemd/systemd-journald
511 ? Ss 0:00 /usr/sbin/lvmetad -f
520 ? Ss 0:00 /usr/lib/systemd/systemd-udevd
615 ? S<sl 0:00 /sbin/auditd
640 ? Ssl 0:00 /usr/lib/polkit-1/polkitd --no-debug
642 ? Ssl 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
645 ? S 0:00 /usr/sbin/chronyd
654 ? Ss 0:00 /usr/lib/systemd/systemd-logind
656 ? Ss 0:00 /usr/sbin/crond -n
668 ? Ss 0:00 login -- root
1648 tty1 Ss+ 0:00 \_ -bash
671 ? Ssl 0:00 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
672 ? Ssl 0:00 /usr/sbin/NetworkManager --no-daemon
1001 ? Ss 0:00 /usr/sbin/sshd -D
1243 ? Ss 0:00 \_ sshd: root@pts/0
1248 pts/0 Ss 0:00 | \_ -bash ※ターミナルの親プロセスと思われる
1641 pts/0 R 6:58 | \_ yes
1643 pts/0 R 6:22 | \_ yes
1674 pts/0 S 0:00 | \_ sleep 120
1678 pts/0 R+ 0:00 | \_ ps axf
1303 ? Ss 0:00 \_ sshd: root@pts/1
1307 pts/1 Ss+ 0:00 \_ -bash
1003 ? Ssl 0:00 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
1004 ? Ssl 0:00 /usr/sbin/rsyslogd -n
1213 ? Ss 0:00 /usr/libexec/postfix/master -w
1223 ? S 0:00 \_ pickup -l -t unix -u
1224 ? S 0:00 \_ qmgr -l -t unix -u
1350 ? Ss 0:00 /usr/sbin/anacron -s
試しにTeraTermの親プロセスIDを終了してみた
[root@localhost ~]# kill 1248
プロセスを表示したところ、親プロセスは終了していませんでした。
[root@localhost ~]# ps -ef | grep -e yes -e sleep
(起動ユーザID)(プロセスID)(親プロセスID)
root 1641 1248 52 09:35 pts/0 00:06:41 yes
root 1643 1248 49 09:35 pts/0 00:06:05 yes
root 1674 1248 0 09:48 pts/0 00:00:00 sleep 120
root 1684 1248 0 09:54 pts/0 00:00:00 grep --color=auto -e yes -e sleep
yesコマンドを終了を試してみました。
yesコマンドを一つ終了しました。
[root@localhost ~]# kill 1641
[root@localhost ~]#
[1]- Terminated yes > /dev/null
プロセスID(1641)のyesコマンドは終了したため、表示から消えました。
[root@localhost ~]# ps -ef | grep -e yes -e sleep
root 1643 1248 49 09:35 pts/0 00:18:36 yes
root 1704 1248 0 10:13 pts/0 00:00:00 grep --color=auto -e yes -e sleep
nohupコマンドを試してみました。
[root@localhost ~]# nohup sleep 10000 &
最後、ターミナルにログインしてプロセス確認したところ、
ttyが?になりました。また親プロセスIDがsystemdのため、1の値になりました。
[root@localhost ~]# ps -ef | grep sleep
(起動ユーザID)(プロセスID)(親プロセスID)
root 1708 1 0 10:17 ? 00:00:00 sleep 10000
root 1733 1717 0 10:20 pts/2 00:00:00 grep --color=auto sleep
まとめ
ターミナルを開くとTTY(例 pts/0)の名前が割り振られてBashの親プロセスが割り振られます。
ターミナル上で実行したプロセスを終了しようとして、誤ってps -efコマンドのプロセスIDの隣に記載してある親プロセスIDをkillしても配下の子プロセスは終了しないことが分かりました。