【问题标题】:How are PIDs modified with exec?如何使用 exec 修改 PID?
【发布时间】:2014-05-02 12:57:40
【问题描述】:

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

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

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

最后,java 应用程序的 pid 不是我在 init 脚本中得到的那个。为什么?

注意:当我只制作一个执行 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 通过 ps -ef: 15950。
  2. pid 与 $! : 15947

有什么想法吗? 谢谢。

【问题讨论】:

  • 请 ps 和 grep 这两个 pid 并将输出粘贴到此处。
  • 当你异步运行$DAEMON时,不需要检查$?。根据标准,“异步列表的退出状态应为零。”

标签: linux bash shell exec


【解决方案1】:

当您将 exec 作为后台进程调用时,您原来的 $DAEMON 正在启动另一个新进程,因此您的 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 好收获。 & 符号很小,却很强大!
  • 就是这样,谢谢。没有考虑后台更改进程 pid。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多