2013-05-14 82 views
1

我在bash中有一个脚本来启动一个java程序,并且我想在程序执行后获取它的pid。该pid将被保存在一个文本文件中。Bash:获取使用不同用户的进程的PID

现在,我有这样的事情:

if [ "$USER" == "root" ] 
then 
    su $APP_USER -c "nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR &" 
    su $APP_USER -c "echo $! > $PID_PATH/$CAT.pid" 
else 
    nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR & 
    echo $! > "$PID_PATH/$CAT.pid" 
fi 

我也试过这样,但它不工作也没有。

if [ "$USER" == "root" ] 
then 
    su $APP_USER -c "(nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR &); (echo $! > $PID_PATH/$CAT.pid)" 
else 
    nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR & 
    echo $! > "$PID_PATH/$CAT.pid" 
fi 
当我运行我的APP_USER所有的伟大工程,当我以root身份运行我的java程序启动,但创建空pid文件

回答

4

尝试

su $APP_USER -c "nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR & echo \$! > $PID_PATH/$CAT.pid" 

\后面$!防止可变的膨胀,传递给su命令之前。

+0

该命令有效,但该文件写入为空。 我没有得到pid。 – fabio 2013-05-14 13:13:33

+0

发现问题...更新..检查现在.. – anishsane 2013-05-14 13:38:03

+0

它的工作! :D 你真是太厉害了,'echo'给出了一个空字符串。这就是为什么该pid文件是空的。 – fabio 2013-05-14 14:37:50

1

问题是,每个su命令是用户的单独调用,所以$!不会存储您的上一个PID,因为没有一个。

您需要做的是将PID保存在与第一个su相同的调用中。要做到这一点,最简单的方法就是把引号两个命令周围,将它们分开用分号

su $APP_USER -c "nohup java $JAVA_OPTS >> $LOG_OUT 2>> $LOG_ERR &; "echo $! > $PID_PATH/$CAT.pid" 

现在su将在同一环境中调用这两个命令。

+0

它是有道理的,我尝试你的命令它给出一个sintax错误,但它可以使用()修复。 (nohup java $ JAVA_OPTS >> $ LOG_OUT 2 >> $ LOG_ERR&);(echo $!> $ PID_PATH/$ CAT.pid)“' '但是我仍然得到一个空文件没有pid。 – fabio 2013-05-14 13:17:17

+0

使用'(...)'在子shell中执行命令。由于您将'echo $!'放在单独的子shell中,因此它将不具有上一个命令的PID。不要使用'(...)'或将两组命令放在同一个'(...)'中。你也可以尝试花括号,比如'{...}'。这会在同一个shell中执行你的命令(但是你必须以';'结束) – 2013-05-14 13:31:56

+0

我在第一个语句结尾时遇到了&&问题。我不需要';'。 '(...)'似乎解决了它......但我需要转义$'' - >'\ $!'。 它的工作原理是这样的: 'su $ APP_USER -c“nohup java $ JAVA_OPTS >> $ LOG_OUT 2 >> $ LOG_ERR&echo \ $!> $ PID_PATH/$ CAT.pid”' Tanks for your feedback。 :) – fabio 2013-05-14 14:45:29

1

如果您的系统提供了start-stop-daemon,那么使用它可能会更容易,而不是创建疯狂的包装。默认情况下,用户将更改(--user)和nohup行为(--background)。此外,您可以使用--make-pidfile来做正确的事情 - 无论您是否切换用户。

+0

你好,这看起来很有趣,但我认为我的SO不支持。 也许需要安装新的东西。我是bash脚本编写新手,这与'su -c“命令如何工作有关。我会做更多的研究。坦克为您的反馈。 – fabio 2013-05-14 14:05:58