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

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

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

nohup java app.Main > /dev/null 2>&1 &
echo $! > /var/run/app.pid

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

su - appuser -c "nohup java app.Main > /dev/null 2>&1 &"
echo $! > /var/run/app.pid

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

答案1

你可以做:

su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
                 echo "$!"' > /var/run/app.pid

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

su -重置环境,所以如果你想在命令行中扩展变量,必须通过你的shell(不是远程用户的登录 shell),例如:

su - appuser -c "nohup '$JAVA_BIN' '$JAVA_CLASS' > /dev/null 2>&1 &"'
                 echo "$!"' > /var/run/app.pid

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

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

相关内容