【问题标题】:Bash: Get pid of a process using a different userBash:使用不同用户获取进程的pid
【发布时间】:2013-05-14 11:50:11
【问题描述】:

我在 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 文件创建为空。

【问题讨论】:

    标签: linux bash app-id


    【解决方案1】:

    试试

    su $APP_USER -c "nohup java $JAVA_OPTS  >> $LOG_OUT 2>> $LOG_ERR & echo \$! > $PID_PATH/$CAT.pid"
    

    \ 后面的$! 防止在传递给 su 命令之前扩展变量。

    【讨论】:

    • 此命令有效,但文件写入为空。我没有得到 pid。
    • 它工作! :D 你说得对,echo 给出了一个空字符串。这就是 pid 文件为空的原因。
    • 用于反馈的坦克。 :)
    【解决方案2】:

    问题在于每个su 命令都是用户的单独调用,因此$! 不会存储您的最后一个PID,因为没有。

    您需要做的是将您的 PID 保存在与第一个 su 相同的调用中。最简单的方法是在两个命令两边加上引号并用分号分隔它们

    su $APP_USER -c "nohup java $JAVA_OPTS  >> $LOG_OUT 2>> $LOG_ERR &; "echo $! > $PID_PATH/$CAT.pid"
    

    现在su 将在同一环境中调用这两个命令。

    【讨论】:

    • 有道理,我尝试你的命令它给出了一个 sintax 错误,但可以使用 () 修复它。 su $APP_USER -c "(nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR &); (echo $! > $PID_PATH/$CAT.pid)" 但我仍然得到一个没有 pid 的空文件。
    • 使用(...) 在子shell 中执行命令。由于您将echo $! 放在单独的子shell 中,它不会有上一个命令的PID。不要使用(...) 或将两组命令放在同一个(...) 中。您也可以尝试像{...} 这样的花括号。这会在同一个 shell 中执行您的命令(但您必须以 ; 终止)
    • 我在第一个语句的末尾遇到了&; 的问题。我不需要;(...) 似乎解决了它......但我需要逃避 $! -> \$!。它的工作原理是这样的:su $APP_USER -c "nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR & echo \$! > $PID_PATH/$CAT.pid" Tanks 供您反馈。 :)
    【解决方案3】:

    如果您的系统提供start-stop-daemon,则使用它可能会更容易,而不是创建疯狂的包装器。默认情况下,您会更改用户 (--user) 和 nohup 行为 (--background)。此外,您可以使用 --make-pidfile 来做正确的事情 - 无论您是否切换用户。

    【讨论】:

    • 你好,这看起来很有趣,但我认为我的 SO 不支持。也许需要安装新的东西。我是 bash 脚本的新手,这与 su -c "command" 的工作方式有关。我会做更多的研究。收集您的反馈意见。
    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2011-09-17
    相关资源
    最近更新 更多