linux - PID 是如何用 exec 修改的?

标签 linux bash shell exec

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

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

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

最后,java 应用程序的 pid 不是我在初始化脚本中获得的 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. 通过 ps -ef 获取的 pid:15950。
  2. pid 和 $! : 15947

有什么想法吗? 谢谢。

最佳答案

当您将 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

关于linux - PID 是如何用 exec 修改的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23428763/

相关文章:

linux - unix 中的数据函数

linux - 无法在 Netbeans 6.8 中部署 Tomcat webapp

linux - 是否有 Unix 配置文件的指南

bash - 编码音频文件,然后使用bash脚本重命名它们

Bash 脚本监听按键以继续

shell - 将输出通过管道传输到 jq 后写入文件

linux -/proc/devices 仍然显示未注册的设备

正则表达式 : How do I replace a number with zero?

linux - Bash 位置参数命令行排序问题

正则表达式排除查找工具的单词