注:我认为我用的是庆典,但/bin/sh是与/bin/仪表,它有种奇怪的执行问题。

我有一个简单的bash脚本在Linux上它是用来启动一个服务器过程(这不是我写的或控制),并希望有的bash脚本输出启动的进程的PID到pidfile.

问题是,bash-执行命令不能取代它自己的进程的启动服务过程!

所以:

echo $$ | cat > /var/run/launched-server.pid

这并 的工作,因为pid在该文件将是bash不服务器的进程。如果服务过程中退出来砸不可以出口离开愚蠢的启动脚本挂在处理列表。

没有人知道一种方法来使用的庆典(或冲也许?) 以便:

  1. 这可能吗?
  2. 推出的服务器服务器进程的PID将在我pidfile?
  3. 确保bash脚本会死的时候的发射服务器的存在并没有离开停止活动的外壳进程挂在处理列表?

编辑:这段从 bash参考手册 是的使用...

exec
           exec [-cl] [-a name] [command [arguments]]

如果命令被提供时,它取代了外壳,而不创建一个新的进程。如果我选择被提供时,壳的地方许在开始时的零参数通过了命令。这是什么登录的程序。-C的选项的原因命令来执行的一个空的环境。如果一个被提供时,壳穿的名字作为第零参数的命令。如果没有命令是规定,重定向可以用于影响当前的外壳的环境。如果没有重定向错误,返回状态是零;否则返回的状态是非零。


编辑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出来也许可以更清楚了吗?

me@chainsaw: ~/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
有帮助吗?

解决方案

没有你的包括分布 start-stop-daemon(8)?奇妙的有用的很少的工具,它的建立是专门为启动进程,从壳脚本。(当然,该进程比壳脚本,所以它不可能是一个完美的比赛--这取决于你为什么想要壳活得比你的守护程序。)

或者,对于简单的东西:

可能你的问题是解决与砸的 exec 命令?它取代了外壳进程的任何程序要求执行:

#!/bin/bash

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

$ ./show_exec.sh 
[nothing happens]

而且,在另一个壳:

$ 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

其他提示

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

通过使用 #!/bin/sh 我是不是援引庆典,但是短跑。

短跑是exec壳与exec问题。如果我用了 #!/bin/bash 从一开始,它将有工作的预期。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top