注意:我以为我使用bash,但/ bin/sh链接到/ bin/dash,它有这个奇怪的exec问题。如何找到dash-exec命令的PID
我在Linux上有一个简单的bash shell脚本,用于启动服务器进程(我没有编写或控制),并希望bash shell脚本将启动的进程的PID输出到pidfile。
问题是,bash-exec命令不会用启动的服务器进程替换它自己的进程!
所以:
echo $$ | cat > /var/run/launched-server.pid
这并不不工作,因为文件中的PID将是庆典的不是服务器进程。如果服务器进程退出bash,则可能无法退出,而将愚蠢的启动脚本放在进程列表中。
有谁知道一种方式来使用bash(或者几许?),这样:
- 这可能吗?
- 启动服务器服务器进程的PID将在我的pidfile中?
- 确保启动服务器存在时bash脚本将会死掉,并且不会在进程列表中留下闲置的shell进程?
编辑: 这从bash reference manual片段是用...
exec
exec [-cl] [-a name] [command [arguments]]
如果提供的命令,它取代了壳,而无需创建一个新的进程。如果提供了-l选项,那么shell会在传递给命令的第零个参数的开始处放置一个破折号。这是登录程序的功能。 -c选项使命令在空白环境下执行。如果提供了-a,那么shell将名称作为命令的第零个参数。如果没有指定命令,重定向可能会影响当前的shell环境。如果没有重定向错误,则返回状态为零;否则返回状态不为零。
编辑2: 这是脚本(消毒):
#!/bin/sh
# this is where the server expects to run its services for Daemontools
SERVICE_DIR='/var/service';
# kill stdout, stderr, stdin
exec </dev/null
exec >/dev/null
exec 2>/dev/null
logger -ip daemon.debug -- stdout, stderr, stdin redirected to /dev/null
if [ -d $SERVICE_DIR ]; then
# sanitized...
logger -ip daemon.debug -- services and supervisors exited
else
logger -ip daemon.err -- $SERVICE_DIR does not exist, exiting
exit 1;
fi
if [ -d /var/run/pid ]; then
echo $$ | cat > /var/run/pid/launched-server.pid
logger -ip daemon.debug -- creating launched-server pidfile
fi
# start the server process
logger -ip daemon.info -- launching server on $SERVICE_DIR
exec /usr/local/bin/launched-server
而且有些ps输出,也许更清楚了吗?
[email protected]: ~/dev $ ps ax | grep launched-server
13896 pts/1 S+ 0:00 /bin/sh ./server_boot
13905 pts/1 S+ 0:00 launched-server /var/service
13938 pts/2 R+ 0:00 grep --color=auto launched-server
没有必要使用'cat':'echo $$>/var/run/pid /已启动server.pid' – 2010-09-01 15:45:08
@ Dennis-Williamson - 好,赶快,谢谢。 – Petriborg 2010-09-01 16:00:13