从使用“su -c”启动的命令中获取进程ID

Pra*_*nth 9 shell bash su

我在 shell 中运行一个 java 程序并将进程 ID 写入文本文件。所以当我这样做时:

nohup java app.Main > /dev/null 2>&1 &
echo $! > /var/run/app.pid
Run Code Online (Sandbox Code Playgroud)

有用。但我真的想以另一个用户的身份运行它

su - appuser -c "nohup java app.Main > /dev/null 2>&1 &"
echo $! > /var/run/app.pid
Run Code Online (Sandbox Code Playgroud)

这不起作用。有没有办法获取使用 -c 选项启动的命令的进程 ID?

Sté*_*las 8

你可以做:

su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
                 echo "$!"' > /var/run/app.pid
Run Code Online (Sandbox Code Playgroud)

(假设 的登录 shellappuser是类似 Bourne 的)。

su -重置环境,因此如果您想在命令行中扩展变量,则必须由您的shell(而不是远程用户的登录 shell)完成,例如:

su - appuser -c "nohup '$JAVA_BIN' '$JAVA_CLASS' > /dev/null 2>&1 &"'
                 echo "$!"' > /var/run/app.pid
Run Code Online (Sandbox Code Playgroud)

(假设这些变量不包含单引号字符)。

您希望重定向由您的 shell(作为 运行root)执行,而不是由appuser的 shell(它可能没有对 的写权限/var/run)执行。

  • 谢谢你。那行得通,但我不得不为我的情况稍微调整一下。出于某种原因,我不得不在 $! 之前添加一个反斜杠!然后由于权限问题,我不得不将其通过管道传输到 tmp 文件。下一行将从 tmp 文件中读取它并将其放入适当的位置。`su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"` (2认同)