从全面启动的init.d脚本(SysV样式)或像rc.local文件这样简单的一行调用开始正在进行的(类似服务的)进程时,我遇到一个特殊的问题:
su someuser -c "/home/someuser/watchdog.sh &"
其中watchdog.sh包含这个:
#!/bin/bash cd /home/someuser until ./eventMonitoring.py do echo "Program crashed with exit code $?. Starting again..." >&2 sleep 1 done
我总是在进程列表中留下一个额外的进程:
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 3048 1 0 1024 620 1 20:04 ? 00:00:00 startpar -f -- rc.local
如果我从我的init.d脚本启动它(来源: https : //github.com/ivankovacevic/userspaceServices )
我得到相同的过程,但它是startpar -f – userspaceServices
这个过程到底是什么? 为什么在查看startpar的手册页时没有提到-f参数? 我作为另一个用户在启动过程中做了什么错误,这个奇怪的startpar过程需要离开(或启动)吗? 为什么这个进程没有出现在任何其他的init.d脚本中?
有人能帮我解释一下这个问题吗?
注意:我的系统是Debian Wheezy 7.4.0
更新!
我已经在stackoverflow上打开了一个新的问题,从程序员的angular度来讨论startpar的行为:
https://stackoverflow.com/questions/22840360/figuring-out-what-startpar-c-sysvinit-is-doing
我的调查进一步导致了我的解决scheme。 所以现在我知道如何正确地做,但我仍然不明白为什么startpar像这样做。 所以如果有人愿意介入并解释,我比愿意接受这个答案要好得多。
基本上问题是我没有将标准input,标准输出和标准错误redirect(或closures)到一个文件或/ dev / null,并由于某种原因startpar ( “用于并行运行多个运行级脚本” )进程,这对我来说是一个在启动时启动其他进程的进程,因此被拦截在这个脚本上。 它确实启动了我的脚本,但是它本身没有完成运行,并且在进程列表中显示为stage:
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 3048 1 0 1024 620 1 20:04 ? 00:00:00 startpar -f -- rc.local
startpar的源代码在这里: http : //svn.savannah.nongnu.org/viewvc/startpar/trunk/startpar.c?root=sysvinit&view=markup
我浏览了一下,并在一个新的问题中进行了初步分析,我发布在了stackoverflow上。 find我在这里添加到我的问题的更新链接。
我使用的最终解决scheme是这样的:
su someuser -c "nohup some_script.sh >/dev/null 2>&1 &"
su – 将用户身份replace为某个用户
-c – su参数来运行指定的命令
nohup – 运行一个免于hangups的命令。 防止父进程终止subprocess的情况。 以防万一。 但在我的具体情况下实际上没有影响。 是否需要取决于环境(检查店铺 )
> / dev / null – 将标准输出redirect为空 ,基本上禁用它。
2>&1 – 将标准错误(2)输出redirect到标准输出(1),将其redirect到空
& – 分离到后台,这会将标准inputredirect到/ dev / null。
看看在我的系统上运行的其他已知守护进程的文件描述符,我发现redirect到/ dev / null是一件常见的事情。 而且只有一些守护进程实际上完全closures了stdin,stdout,stderr。 这可以通过以下方式实现:
su someuser -c "some_script.sh 0<&- 1>&- 2>&- &"
从实际意义上说,它们是完全相同的,它是需要的(或者是选项)将一个进程完全分离为一个后台守护进程。