2010-09-01 73 views
1

注意:我以为我使用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(或者几许?),这样:

  1. 这可能吗?
  2. 启动服务器服务器进程的PID将在我的pidfile中?
  3. 确保启动服务器存在时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 
+0

没有必要使用'cat':'echo $$>/var/run/pid /已启动server.pid' – 2010-09-01 15:45:08

+0

@ Dennis-Williamson - 好,赶快,谢谢。 – Petriborg 2010-09-01 16:00:13

回答

1

您的配送是否包含start-stop-daemon(8)?非常有用的小工具,它专门用于从shell脚本启动守护进程。 (当然,守护进程活得比的shell脚本,所以它可能不是一个完美的匹配 - 这取决于你为什么希望shell活得比你的守护进程)。

或者,更简单的东西:

莫非你的问题可以通过bash的exec命令解决?它代替你向我要什么程序来执行shell进程:

#!/bin/bash 

echo $$ > /tmp/pidfile 
exec /bin/sleep 60 

$ ./show_exec.sh 
[nothing happens] 

而且,在另一个shell:

$ cat pidfile 
24686 
$ ps auxw | grep 24686 
sarnold 24686 0.0 0.0 9728 816 pts/1 S+ 04:53 0:00 /bin/sleep 60 
+0

其中一个问题是,脚本超出了守护进程,而不是其他方式:-)它可能是一个简单的问题,我只是混淆起来.. – Petriborg 2010-09-01 12:01:19

+0

虽然你的答案不直接给我一个解决方案在bash-每次说,我不得不说,启动 - 停止守护进程是现货,是一个伟大的小软件。我已经用bash的exec来“解决”了我的问题。 – Petriborg 2010-09-01 14:53:19

2

我现在意识到了真正的问题是什么:

通过使用#!/bin/sh我没有调用bash,而是破折号。

Dash的exec是exec问题的shell。如果我从一开始就使用#!/bin/bash,它会按预期工作。