如何用exec修改PID?

时间:2014-05-02 12:57:40

标签: linux bash shell exec

根据文档,exec不会修改进程的pid。

我正在使用一项服务来启动我的流程,并且旨在让他的pid将他保存在/ var / run /中。 为此,我使用$!。

我的init脚本调用一个.sh文件,该文件对另一个.sh文件执行exec。然后该文件对java进行exec调用。

最后,java app所拥有的pid不是我在init脚本中获得的pid。为什么?

注意:当我只制作一个执行exec java的sh脚本时,这是有效的。但我不知道为什么添加一个执行官会改变任何东西。

代码,如果有助于理解。

初始化脚本:

$DAEMON > /var/local/red5/log/jvm.stdout 2>&1 &
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
        echo $! > $PIDFILE
fi

$ DAEMON致电:

if [ -z "$RED5_HOME" ]; then export RED5_HOME=`pwd`; fi
ulimit -n 32767
# start Red5
exec /bin/bash $RED5_HOME/red5.sh > $RED5_HOME/log/jvm.stdout 2>&1 &

我的red5.sh调用java :(之前有一些导出)

# start Red5
exec "$JAVA" "$JYTHON" -Dred5.root="${RED5_HOME}" $JAVA_OPTS -cp "${RED5_CLASSPATH}" "$RED5_MAINCLASS" $RED5_OPTS

如果我这样做的话:

if [ -z "$RED5_HOME" ]; then export RED5_HOME=`pwd`; fi
ulimit -n 32767
# start Red5
exec "$JAVA" "$JYTHON" -Dred5.root="${RED5_HOME}" $JAVA_OPTS -cp "${RED5_CLASSPATH}" "$RED5_MAINCLASS" $RED5_OPTS

结果

  1. pid via ps -ef:15950。
  2. pid with $! :15947
  3. 有什么想法吗? 谢谢。

2 个答案:

答案 0 :(得分:3)

当您将$DAEMON作为后台进程调用时,原始exec正在启动另一个新进程,因此您的Java程序运行的时间与后台进程启动的进程不同在init脚本中。只需使用

运行exec即可
if [ -z "$RED5_HOME" ]; then export RED5_HOME=`pwd`; fi
ulimit -n 32767
# start Red5

# CHANGE: no ampersand at the end of this line
exec /bin/bash $RED5_HOME/red5.sh > $RED5_HOME/log/jvm.stdout 2>&1

答案 1 :(得分:2)

在追加&字符时,您在后台提交作业,因此它会获得自己的新pid。

编辑:感谢您的downvote。我的意思是这一行:

exec /bin/bash $RED5_HOME/red5.sh > $RED5_HOME/log/jvm.stdout 2>&1 &