我正在 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
)执行。