【調査1】 「RemainAfterExit=yes」オプションのときのTypeの実態調査
せ7> pwd
/usr/lib/systemd/system
せ7> find . -type f -print0 | xargs -0 grep -B 10 -A 10 "RemainAfterExit=yes" | grep Type
./rc-local.service-Type=forking
./quotaon.service-Type=oneshot
./blk-availability.service-Type=oneshot
./kmod-static-nodes.service-Type=oneshot
./halt-local.service-Type=oneshot
./systemd-random-seed.service-Type=oneshot
./systemd-readahead-collect.service-Type=notify
./systemd-sysctl.service-Type=oneshot
./rhel-autorelabel.service-Type=oneshot
./rhel-dmesg.service-Type=oneshot
./systemd-backlight@.service-Type=oneshot
./systemd-binfmt.service-Type=oneshot
./systemd-tmpfiles-setup-dev.service-Type=oneshot
./systemd-tmpfiles-setup.service-Type=oneshot
./systemd-firstboot.service-Type=oneshot
./systemd-udev-settle.service-Type=oneshot
./systemd-fsck-root.service-Type=oneshot
./systemd-udev-trigger.service-Type=oneshot
./systemd-fsck@.service-Type=oneshot
./systemd-readahead-replay.service-Type=notify
./systemd-update-done.service-Type=oneshot
./systemd-hwdb-update.service-Type=oneshot
./systemd-update-utmp.service-Type=oneshot
./systemd-user-sessions.service-Type=oneshot
./systemd-journal-catalog-update.service-Type=oneshot
./systemd-remount-fs.service-Type=oneshot
./systemd-journal-flush.service-Type=oneshot
./systemd-vconsole-setup.service-Type=oneshot
./rdma.service-Type=oneshot
./systemd-rfkill@.service-Type=oneshot
./systemd-machine-id-commit.service-Type=oneshot
./rhel-autorelabel-mark.service-Type=oneshot
./systemd-modules-load.service-Type=oneshot
./systemd-quotacheck.service-Type=oneshot
./cpupower.service-Type=oneshot
./rhel-configure.service-Type=oneshot
./rhel-domainname.service-Type=oneshot
./rhel-import-state.service-Type=oneshot
./rhel-loadmodules.service-Type=oneshot
./rhel-readonly.service-Type=oneshot
./ebtables.service-Type=oneshot
./arp-ethers.service-Type=oneshot
./NetworkManager-wait-online.service-Type=oneshot
./lvm2-monitor.service-Type=oneshot
./lvm2-pvscan@.service-Type=oneshot
./kdump.service-Type=oneshot
./sshd-keygen.service-Type=oneshot
./chrony-wait.service-Type=oneshot
→「Type」はほとんど「oneshot」だけど、「forking」が1個、「notify」が2個あったんご。
→「RemainAfterExit=yes」はほとんど「Type=oneshot」で使われるが、必ずしも「Type=oneshot」でなくてもよい。
※上記のサービスの中でシステムサービスではなく、普通のサーバデーモンっぽいサービスは、chrony-wait.serviceか?
せ7> pwd
/usr/lib/systemd/system
せ7> ll chrony*.service
-rw-r--r--. 1 root root 209 11月 15 2016 chrony-dnssrv@.service
-rw-r--r--. 1 root root 419 11月 15 2016 chrony-wait.service
-rw-r--r--. 1 root root 331 11月 15 2016 chronyd.service
→なんかサーバデーモンなのは「chronyd.service」っぽい気がするんご
せ7> cat chronyd.service
[Unit]
Description=NTP client/server
After=ntpdate.service sntp.service ntpd.service
Conflicts=ntpd.service
[Service]
Type=forking
PIDFile=/var/run/chronyd.pid
EnvironmentFile=-/etc/sysconfig/chronyd
ExecStart=/usr/sbin/chronyd $OPTIONS
ExecStartPost=/usr/libexec/chrony-helper update-daemon
[Install]
WantedBy=multi-user.target
せ7> ps -ef | grep chrony | grep -v grep
chrony 719 1 0 18:34 ? 00:00:00 /usr/sbin/chronyd
せ7> systemctl status chronyd
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since 土 2018-03-31 18:34:22 JST; 5h 17min ago
Process: 736 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
Process: 710 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 719 (chronyd)
CGroup: /system.slice/chronyd.service
mq719 /usr/sbin/chronyd
せ7> systemctl status chrony-wait
● chrony-wait.service - Wait for chrony to synchronize system clock
Loaded: loaded (/usr/lib/systemd/system/chrony-wait.service; disabled; vendor preset: disabled)
Active: inactive (dead)
常駐してるプロセスはchrony-waitサービスの方ではなくて、chronydサービスの方ですね
→「RemainAfterExit=yes」のサービスの中でActive:activeなものはあるのか?
せ7> find . -type f -print0 | xargs -0 grep -l "RemainAfterExit=yes" | sed -e "s/^\.\///" | while read x;do echo "--- $x ---";systemctl status $x 2> /dev/null | egrep 'Active: active|Main PID:';done | grep -B 2 "Main PID:"
--- kmod-static-nodes.service ---
Active: active (exited) since 土 2018-03-31 18:34:20 JST; 6h ago
Main PID: 561 (code=exited, status=0/SUCCESS)
--- systemd-random-seed.service ---
Active: active (exited) since 土 2018-03-31 18:34:20 JST; 6h ago
Main PID: 576 (code=exited, status=0/SUCCESS)
--- systemd-sysctl.service ---
Active: active (exited) since 土 2018-03-31 18:34:20 JST; 6h ago
Main PID: 562 (code=exited, status=0/SUCCESS)
--- rhel-dmesg.service ---
Active: active (exited) since 土 2018-03-31 18:34:22 JST; 6h ago
Main PID: 713 (code=exited, status=0/SUCCESS)
--- systemd-tmpfiles-setup-dev.service ---
Active: active (exited) since 土 2018-03-31 18:34:20 JST; 6h ago
Main PID: 569 (code=exited, status=0/SUCCESS)
--- systemd-tmpfiles-setup.service ---
Active: active (exited) since 土 2018-03-31 18:34:21 JST; 6h ago
Main PID: 687 (code=exited, status=0/SUCCESS)
--- systemd-udev-settle.service ---
--- systemd-fsck-root.service ---
Main PID: 464 (code=exited, status=0/SUCCESS)
--- systemd-udev-trigger.service ---
Active: active (exited) since 土 2018-03-31 18:34:20 JST; 6h ago
Main PID: 582 (code=exited, status=0/SUCCESS)
--- systemd-update-utmp.service ---
Active: active (exited) since 土 2018-03-31 18:34:21 JST; 6h ago
Main PID: 707 (code=exited, status=0/SUCCESS)
--- systemd-user-sessions.service ---
Active: active (exited) since 土 2018-03-31 18:34:22 JST; 6h ago
Main PID: 714 (code=exited, status=0/SUCCESS)
--- systemd-remount-fs.service ---
Active: active (exited) since 土 2018-03-31 18:34:20 JST; 6h ago
Main PID: 563 (code=exited, status=0/SUCCESS)
--- systemd-journal-flush.service ---
Active: active (exited) since 土 2018-03-31 18:34:20 JST; 6h ago
Main PID: 571 (code=exited, status=0/SUCCESS)
--- systemd-vconsole-setup.service ---
Active: active (exited) since 土 2018-03-31 18:34:17 JST; 6h ago
Main PID: 91 (code=exited, status=0/SUCCESS)
--- rhel-import-state.service ---
Active: active (exited) since 土 2018-03-31 18:34:21 JST; 6h ago
Main PID: 677 (code=exited, status=0/SUCCESS)
--- rhel-readonly.service ---
Active: active (exited) since 土 2018-03-31 18:34:20 JST; 6h ago
Main PID: 572 (code=exited, status=0/SUCCESS)
--- NetworkManager-wait-online.service ---
Active: active (exited) since 土 2018-03-31 18:34:34 JST; 6h ago
Main PID: 768 (code=exited, status=0/SUCCESS)
--- lvm2-monitor.service ---
Active: active (exited) since 土 2018-03-31 18:34:21 JST; 6h ago
Main PID: 566 (code=exited, status=0/SUCCESS)
--- kdump.service ---
Active: active (exited) since 土 2018-03-31 18:34:48 JST; 6h ago
Main PID: 1253 (code=exited, status=0/SUCCESS)
→結構ある!
上記はすべて、「exited」となっているがsystemdから死活が監視されているのか?あるいは監視する必要がないのか?
→下記が「RemainAfterExit=yes」なサービスの「Main PID」のリスト
せ7> find . -type f -print0 | xargs -0 grep -l "RemainAfterExit=yes" | sed -e "s/^\.\///" | while read x;do echo "--- $x ---";systemctl status $x 2> /dev/null | egrep 'Active: active|Main PID:';done | grep "Main PID:" | awk '{print $3}' | tr \\n " "
561 576 562 713 569 687 464 582 707 714 563 571 91 677 572 768 566 1253
上記の出力結果をパイプで下記に渡すと、
せ7> ・・・省略・・・ | while read y;do ps -ef | grep " $y " | grep -v grep;done
せ7> ←すべてのMain PIDはすでに居ない(exited済み)
PIDFileとしてsystemdに「メインプロセスのPID」をpidファイルで教えてるか?
せ7> find . -type f -print0 | xargs -0 grep -A 10 -B 10 "RemainAfterExit=yes" | grep PIDFile
せ7> ←「RemainAfterExit=yes」かつ「PIDFile指定」な.serviceファイルは無し
※つまり、systemdは「Type=oneshot」かつ「RemainAfterExit=yes」で起動されるメインプロセスをPIDファイル、Type=simpleのいずれの方法でもメインプロセスのPIDを追跡しない?
※「Type=oneshot」で起動されるデーモンサービスのメンツはみんなシステムサービスっぽい
ということは、死活に関してはもっと基幹的な別のしくみで監視されるか?そもそも死活監視されないのか? あるいはメインプロセスとして常駐するプロセスが無いのか?
【調査2】 「Type=forking」でかつ「PIDFile」オプションを指定してないサービスはあるのか?
・「Type=forking」でかつ「PIDFile」オプションを指定してるサービス
せ7> find . -type f -print0 | xargs -0 grep -l "Type=forking" | while read x;do grep PIDFile $x > /dev/null && echo "--- $x ---";done
--- ./sshd.service ---
--- ./nginx-debug.service ---
--- ./nginx.service ---
--- ./htcacheclean.service ---
--- ./chronyd.service ---
--- ./postfix.service ---
--- ./postgresql-10.service ---
・「Type=forking」でかつ「PIDFile」オプションを指定してないサービス
せ7> find . -type f -print0 | xargs -0 grep -l "Type=forking" | while read x;do grep PIDFile $x > /dev/null || echo "--- $x ---";done
--- ./rc-local.service ---
--- ./rdisc.service ---
--- ./tcsd.service ---
--- ./svnserve.service ---
--- ./plymouth-halt.service ---
--- ./plymouth-kexec.service ---
--- ./plymouth-poweroff.service ---
--- ./plymouth-reboot.service ---
--- ./plymouth-start.service ---
--- ./iprdump.service ---
--- ./iprinit.service ---
--- ./iprupdate.service ---
※「Type=forking」でかつ「PIDFile」オプションを指定してないサービスはやはりシステムサービスっぽいメンツばかり
※普通のサーバデーモンで「Type=forking」のものは、ほぼ「PIDFile」オプションを指定している
【調査3】 「Type=simple」のサービス一覧
せ7> find . -type f -print0 | xargs -0 grep -l "Type=simple"
./dovecot.service
./dm-event.service
./tomcat@.service
./tomcat.service
./lvm2-lvmetad.service
./lvm2-lvmpolld.service
※ちなみに[Service]セクションに「Type」オプションの記載がないものはデフォルトで「Type=simple」ということなので下記も調べる
せ7> find . -type f -name "*.service" | while read x;do grep "Type=" $x > /dev/null || echo "--- $x ---";done
--- ./teamd@.service ---
--- ./debug-shell.service ---
--- ./brandbot.service ---
--- ./systemd-timedated.service ---
--- ./systemd-ask-password-console.service ---
--- ./systemd-ask-password-wall.service ---
--- ./systemd-bootchart.service ---
--- ./systemd-hostnamed.service ---
--- ./systemd-importd.service ---
--- ./systemd-initctl.service ---
--- ./systemd-localed.service ---
--- ./systemd-logind.service ---
--- ./systemd-machined.service ---
--- ./systemd-shutdownd.service ---
--- ./dbus.service ---
--- ./crond.service ---
--- ./systemd-ask-password-plymouth.service ---
--- ./dnsmasq.service ---
--- ./vmtoolsd.service ---
--- ./auditd.service ---
--- ./irqbalance.service ---
--- ./sshd@.service ---
【調査4】 「Type=notify」のサービス一覧
せ7> find . -type f -print0 | xargs -0 grep -l "Type=notify"
./systemd-readahead-collect.service
./systemd-readahead-replay.service
./systemd-udevd.service
./systemd-journald.service
./systemd-nspawn@.service
./httpd.service
./rsyslog.service
【調査5】 「Type=dbus」のサービス一覧
せ7> find . -type f -print0 | xargs -0 grep -l "Type=dbus"
./polkit.service
./wpa_supplicant.service
./NetworkManager-dispatcher.service
./NetworkManager.service
./firewalld.service
./tuned.service
【調査6】 「Type=idle」のサービス一覧
せ7> find . -type f -print0 | xargs -0 grep -l "Type=idle"
./console-getty.service
./console-shell.service
./container-getty@.service
./rescue.service
./emergency.service
./getty@.service
./serial-getty@.service
【調査7】 Red Hat Enterprise Linux 7 システム管理者のガイド
True に設定される場合、サービスは、そのプロセスがすべて終了していてもアク ティブと見なされます。デフォルトの値は False です。このオプション は、Type=oneshot が設定されている場合にとくに役に立ちます。
【調査8】 manをもう一度読むんご
■SYSTEMD.SERVICE(5) の抜粋
せ7> man 5 systemd.service