我在 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?
你可以做:
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
)执行。