当从rc.local或init.d启动进程时,startpar进程挂起

从全面启动的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>&- &" 

从实际意义上说,它们是完全相同的,它是需要的(或者是选项)将一个进程完全分离为一个后台守护进程。