2013-05-14 47 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