参考:start-stop-daemon(8) - Linux manual page
1、名称
start-stop-daemon:启动和停止系统守护程序。
2、简介
start-stop-daemon [option...] command
3、描述
start-stop-daemon用于控制系统级进程的创建和终止。使用其中一个匹配选项,可以配置start-stop-deamon寻找一个正在运行进程的已有实例。
注意:除非指定--pid或--pidfile,start-stop-daemon行为类似killall。start-stop-daemon将扫进程表查找任何匹配这个进程名,(如果指定了)父进行pid,uid和/或gid的进程。任何匹配的进行将阻止--start启动这个守护进程。如果指定了--stop(或者通过--signal或--retry指定了一个),将发送TERM信号给所有匹配的进程。对于有存活过一个--stop的长生存期子进程的守护进程,你必须指定一个pidfile。
4、命令
1)-S --start [--] arguments
检查一个指定的进程的存在性。如果这样一个进程存在,start-stop-daemon什么也不做,并且用错误状态1退出(如果指定--oknodo,0)。如果这样一个进程不存在,它启动一个实例,使用通过--exec指定可执行文件,或者通过--startas指定。在命令行上--后传递的任何参数被不修改地传递给要被启动的程序。
2) -K, --stop
检查一个指定进程的存在性。如果这样一个进程存在,start-stop-daemon向他发送由--signal指定的信号,并且以错误状态0退出。如果这样一个进程不存在,start-stop-daemon以错误状态1退出(如果指定了--oknodo则0)。如果指定了--retry,则start-stop-daemon将检查这些进程已经终止了。
3)-T, --status
检查指定进程的存在性,并且根据LSB Init脚本操作,返回一个退出状态码。
4)-H,--help
显示用法信息并且退出。
5)-V, --version
显示程序版本并且退出。
5、选项
进行匹配的选项
1)--pid pid
用指定的pid检查一个进程。这个pid必须是一个大于0的数值。
2)--ppid ppid
用父进程pid ppid检查一个进程。这个ppid必须是一个大于0的数值。
3)-p, --pidfile pidfile
检查一个进程是否已经创建文件pidfile。
注意:如果旧进程终止了,而没有能够删除这个pidfile,单独使用这个进行匹配的选项,可能引起操作非预期的进程。
警告:对全局可写的pidfile使用这个匹配选项,或者对以非特权用户(非root)写这个pidfile的守护进程单独使用他,将用一个错误拒绝,由于这是一个安全风险,因为任何用户能够写入他,或者如果守护进程受到损坏,pidfile的内容不能被信任,并且接着一个特权运行程序(诸如一个以root被执行的init脚本)会结束操作任何系统进程。使用/dev/null时免除这些检查。
4)-x, --exec executable
检查进程是这个executable的实例。executable参数应该是一个绝对路径。
注意:这可能没有按被解析脚本预计地运行,由于可执行文件将指向这个解析器。考虑从一个chroot内运行的进程也将被匹配,因此可能也需要其它匹配限制。
5)-n, --name process-name
用名称process-name检查进程。process-name通常是进程文件名,但它可能已经被这个进程自身更改。
注意:在大多数系统上,这些信息取自源自内核的进程comm名,它倾向于有相当短的长度限制(认为多于15个字符是不可移植的)。
6)-u, --user username|uid
检查由username或uid指定用户拥有的进程。
注意:单独使用这个匹配选项将使得匹配这个用户的所有进程被操作。
通用选项
1)-g, --group group|gid
当启动这个进程时,切换到group或gid。
2)-s, --signal signal
带上--stop,指定信号发送给被终止的进程(默认:TERM)。
3) -R, --retry timeout|schedule
使用--stop,指定start-stop-daemon检查这些进程是否结束了。它将重复检查任何匹配的进行是否正在运行,直到没有匹配的进程运行。如果这些进程不存在,它将采取由调度表决定的进一步操作。
如果指定了timeout替代schedule,则调度表signal/timeout/KILL/timeout被使用,此处signal是由--signal指定的信号。
schedule是一个列表,其至少有由斜杆(/)分隔的两项;每项可能是-signal-number或[-]signal-name,它表示发送那个信号,或timeout,它表示为进程退出等待那些秒数,或者forever,它表示如果需要一直重复调度表余下的。
如果到达了调度表末尾并且没有指定forever,则start-stop-daemon以错误状态2退出。如果指定了一个调度表,则忽略用--signal指定的任何信号。
4)-a, --startas pathname
和--start一起,启动通过pathname指定的进程。如果没有指定,默认为传递给-exec的参数。
5)-t, --test
打印将采取的操作以及设置合适的返回值,但不采取行动。
6)-o, --oknodo
如果没有操作被采取,返回退出状态0替代1。
7)-q, --quiet
不打印信息消息;仅显示错误消息。
8)-c, --chuid username|uid[:group|gid]
在启动进程前,切换到这个用户名/uid。你也可以通过用你对chown命令(user:group)相同的方式追加一个:接着组或者gid,指定一个组。如果不带组指定一个用户,使用那个用户的主GID。当你使用这个选项时,即使没有指定--group选项,你必须知道主组和补充组也被设置了。--group选项仅用于用户通常不是其组员的组(如为一般用户添加每个组成员资格像nobody)。
9) -r, --chroot root
在启动这个进程前,更改目录并且根目录切换到root。请注意pidfile也被写在这个chroot之后。
10)-d, --chdir path
在启动这个进程前,切换目录到path。如果设置了-r |--chroot选项,在chroot后做这件事。当未被指定,在启动这个进程前,start-stop-daemon将切换目录到root目录。
11)-b, --background
一般跟不靠它们自己分离的程序一起使用。这个选项将强制start-stop-daemon在启动进程前fork,并且强制它进入后台。
警告:如果进程由于任何原因执行出错,start-stop-daemon不能检查退出状态。这是最后的方法,并且仅只适用于这样的程序,靠其自己forking没有意义或者为它们添加它们自己做这件事的代码是不合理的。
12) --notify-await
在认为服务器被启动前,等待后台进程发送一个准备好的通知。这实现了部分的systemd准备好协议,如在sd_notify(3)手册页中指定。支持一下变量:
READY=1:程序准备好提供服务,因此我们可以安全地退出。
EXTEND_TIMEOUT_USEC=number:程序请求增加超时时间number微妙。这将重置当前超时时间为指定的值。
ERRNO=number:程序以一个错误退出。做相同事情并且为errno值打印用户友好字符串。
13)--notify-timeout timeout
为-notify-await选项设定超时时间。当超时时间到了,start-stop-daemon将以一个错误代码退出,并且将不等待准备好通知。默认值是60秒。
14)-C, --no-close
当强制守护进程进入后台时,不关闭任何文件描述符。用于调试目的来查看进程输出,或者重定向文件描述符来记录进程输出。仅在使用--background时,才有用。
15)-O, --output pathname
当强制守护进程进入后台时,重定向stdout和stderr到pathname。仅在使用--background时,才有用。
16)-N, --nicelevel int
这在启动进程前更改了它的优先级。
17)-P, --procsched policy:prority
在启动进程前,这更改了它调度测量和进程优先级。通过在末尾添加一个:后跟值,可选地指定优先级。当前支持的测量是other, fifo和rr。
这个选项在某些不支持POSIX进程调度的系统上什么也不做。
18)-I, --iosched class:priority
在启动进程前,这更改了它的IO调度器类和优先级。通过在末尾添加一个:后跟值可选地指定优先级。默认优先级是4,除非类是idle,则优先级总是7。对于类,当前支持地值是idle,best-effort和real-time。
这个选项在不支持Linux IO调度地某些系统上什么也不做。
19) -k, --umask mask
这在启动进程前设置它地umask。
20)-m, --make-pidfile
当前启动一个不创建其自己pid文件地程序时,使用。这个选项将使得start-stop-daemon创建由--pidfile引用的文件,并且在执行这个进程前向其放置这个pid。注意,当使用了--remove-pidfile,在停止程序时,这个文件才被删除。
注意:这个特性不是在所有情况下有作用。当被执行的程序从其主进程forks时,最明显。由于此,仅在结合--background选项一起使用时,它通常才有作用。
21)--remove-pidfile
当终止一个不删除它自己pid文件的程序时,被使用。这个选项将使得start-stop-daemon在终止这个进程后删除由--pidfile引用的文件。
22) -v, --vervose
打印详细的信息消息。
退出状态
1)0:请求的操作被执行。如果指定了--oknodo,什么也没做也是可能的。当指定了--start,并且一个匹配的进程已经在运行了,或者在指定--stop并且没有匹配的进程时,这会发生。
2)1:如果没有指定--oknodo,并且什么也没有做。
3)2:如果指定了--stop和--retry,但到达了调度表末尾并且进程仍在运行。
4)3:任何其它错误。
当使用--status命令时,返回以下状态代码:
1)0:程序正在运行。
2)1:程序没有在运行并且pid文件存在。
3)3:程序没有在运行。
4)4:不能确定程序状态。
示例
1)启动food守护进程,除非一个已经在运行了(一个名为food的进程,以用户food运行,用pid在food.pid中)
start-stop-daemon --start --oknodo --user food --name food \
--pidfile /usr/local/var/run/food.pid --startas /usr/sbin/food \
--chuid food -- --daemon
2) 发送SIGTERM给food并且最多等待5秒等待其停止:
start-stop-daemon --stop --oknodo --user food --name food \
--pidfile /usr/local/var/run/food.pid --retry 5
3) 一个停止food的自定义调度表的演示:
start-stop-daemon --stop --oknodo --user food --name food \
--pidfile /usr/local/var/run/food.pid --retry=TERM/30/KILL/5