ps -eo ppid,pid,sid,stat,tty,comm | awk '{ if ($2 == $3 && $5 == "?") {print $0}; }'
首先,要注意,守护进程(daemon)和后台进程(background process)有区别。
守护进程是一种后台进程,但是,同时,它必须具备以下特性:
1. 没有控制它的tty
2. 必须是一个session leader
3. 必须是一个进程组的leader
4. 执行后台任务
5. root目录即为工作目录
6. umask设置为0
7. 文件描述符(file descriptor)都必须先关闭,然后再关联相应文件(或者设备),如果有需要的话。
Wiki原文摘录如下:
On a Unix-like system, the common method for a process to become a daemon, when the process is started from the command line or from a startup script such as an init script or a SystemStarter script, involves:
Dissociating from the controlling tty
Becoming a session leader
Becoming a process group leader
Executing as a background task by forking and exiting (once or twice). This is required sometimes for the process to become a session leader. It also allows the parent process to continue its normal execution.
Setting the root directory (/) as the current working directory so that the process does not keep any directory in use that may be on a mounted file system (allowing it to be unmounted).
Changing the umask to 0 to allow open(), creat(), et al. operating system calls to provide their own permission masks and not to depend on the umask of the caller
Closing all inherited files at the time of execution that are left open by the parent process, including file descriptors 0, 1 and 2 for the standard streams (stdin, stdout and stderr). Required files will be opened later.
Using a logfile, the console, or /dev/null as stdin, stdout, and stderr
实际上,当我们查找守护进程的时候,没有必要用到以上那么多的标准,我们只需要用两条:
1. 没有控制终端
2. session leader
所以我们可以用文中最开始提到的命令来查找:
ps -eo ppid,pid,sid,stat,tty,comm | awk '{ if ($2 == $3 && $5 == "?") {print $0}; }'
E.g
chenqi@pek-qchen1-d1:~/test [1] $ ps -eo ppid,pid,sid,stat,tty,comm | awk '{ if ($2 == $3 && $5 == "?") {print $0}; }'
0 1 1 Ss ? init
1 401 401 Ss ? systemd-udevd
1 435 435 Ssl ? rsyslogd
1 446 446 Ss ? dbus-daemon
1 520 520 Ss ? rpc.idmapd
1 530 530 Ss ? systemd-logind
1 575 575 Ss ? bluetoothd
1 750 750 Ss ? smbd
1 762 762 Ss ? rpcbind
1 779 779 Ss ? rpc.statd
1 829 829 Ssl ? ModemManager
1 950 950 Ssl ? NetworkManager
1 993 993 Ss ? cups-browsed
1 1424 1424 Ss ? nmbd
1 1550 1550 Ss ? acpid
1 1559 1559 Ss ? cron
1 1560 1560 Ss ? atd
1 1565 1565 Ss ? sshd
1 1612 1612 Ssl ? automount
1 1622 1622 Ssl ? named
1 1627 1627 Ssl ? whoopsie
1 1664 1664 Ss ? gdomap
1 1670 1670 Ss ? kerneloops
1 1721 1721 Ss ? rpc.mountd
1 1829 1829 Ss ? master
1 1998 1998 Ss ? apache2
1 2016 2016 SLsl ? lightdm
2561 2588 2588 Ss ? init
2588 2653 2653 Ss ? dbus-daemon
2588 2656 2656 Ss ? ssh-agent
2588 2663 2663 Ss ? upstart-event-b
2588 2667 2667 Ss ? window-stack-br
2588 2668 2668 Ssl ? ibus-daemon
2588 2681 2681 Ssl ? unity-settings-
2588 2686 2686 Ssl ? hud-service
2588 2687 2687 Ssl ? at-spi-bus-laun
2588 2688 2688 Ssl ? gnome-session
2588 2693 2693 Ssl ? unity-panel-ser
2588 2786 2786 Ssl ? indicator-messa
2588 2789 2789 Ssl ? indicator-bluet
2588 2792 2792 Ssl ? indicator-power
2588 2799 2799 Ssl ? indicator-datet
2588 2800 2800 Ssl ? indicator-sound
2588 2803 2803 Ssl ? indicator-print
2588 2866 2866 Ssl ? indicator-sessi
2588 2879 2879 Ssl ? indicator-appli
1 24409 24409 Ss ? cupsd