我在 bash 中有一个脚本来启动一个 java 程序,我想在程序执行后获取它的 pid。 pid 将保存在文本文件中。
现在我有这样的东西:
if [ "$USER" == "root" ]
then
su $APP_USER -c "nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR &"
su $APP_USER -c "echo $! > $PID_PATH/$CAT.pid"
else
nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR &
echo $! > "$PID_PATH/$CAT.pid"
fi
我也这样试过,但都不行。
if [ "$USER" == "root" ]
then
su $APP_USER -c "(nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR &); (echo $! > $PID_PATH/$CAT.pid)"
else
nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR &
echo $! > "$PID_PATH/$CAT.pid"
fi
当我以我的 APP_USER 身份运行时一切正常,当我以 root 身份运行时我的 java 程序启动但 pid 文件创建为空。
最佳答案
尝试
su $APP_USER -c "nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR & echo \$! > $PID_PATH/$CAT.pid"
$!
后面的 \
防止在传递给 su 命令之前扩展变量。
关于linux - Bash:使用不同的用户获取进程的pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542417/