从“ su -c”启动的命令中删除process-id


9

我在外壳中运行Java程序,并将process-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?

Answers:


8

你可以做:

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

(假设的登录外壳appuser类似于Bourne)。

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

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

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

您希望重定向由您的外壳程序(以root)运行,而不是由appuser外壳程序(可能没有对的写入权限/var/run)执行。


2
谢谢。那行得通,但是我需要针对我的情况进行一些调整。由于某些原因,我必须在$之前加一个反斜杠!然后由于权限问题,我不得不将其通过管道传输到tmp文件。下一行将从tmp文件中读取它,并将其放置在正确的位置。 su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"
2014年

@Prasanth,请参阅我的编辑。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.