2012-12-27 26 views
6

我已經編寫了一個bash腳本來在後臺運行服務並從腳本退出到命令行。但是在運行eval命令後,控制不會執行下一條語句。在運行eval命令後控制下一個語句

COMMAND="nohup java -jar jenkins.war" 
echo "starting service" 
eval $COMMAND 
echo "service running" 
exit 

回聲「服務運行」並退出從不發生。我想在後臺運行該進程,並在服務仍在運行時返回到命令提示符。我該怎麼做呢?

+0

謝謝大家誰回答了這個問題,並幫助我! :-) – user1164061

回答

11

請不要在字符串中輸入其參數的命令。將您的命令及其參數置於數組(並且不使用大寫變量名稱,這是非常糟糕的做法),並且不使用evaleval是邪惡的!

command=(nohup java -jar jenkins.war) 
echo "starting service" 
"${command[@]}" 2> /dev/null & 
echo "service running" 

&是讓該命令在後臺運行。

+0

感謝它的工作。我有一個子問題。現在,在回顯「服務運行」後,它返回到命令提示符,但它顯示「nohup:將輸出追加到'nohup.out',並且在我按下ctrl + c之前不會返回到命令提示符。我如何直接進入命令提示符沒有按ctrl + c?我不介意保存輸出到任何文件名,但過程不應該停止任何時間,直到我殺了它 – user1164061

+0

@ user1164061你不必按Ctrl + C,只需按Enter鍵。編輯我的文章,這樣你就不會有惱人的信息 –

+0

對於'eval'註釋+1,''$ {command [@]} +10「 – l0b0

1

eval不能解決這個問題,您需要'後臺運行'字符,即'&'(不含引號)。

重寫你行

#eval $COMMAND 
$COMMAND & 

根據還有什麼你真的在$ COMMAND,你可能需要把eval回來。

另外,根據您的需要,在後臺運行的過程中會產生一些jobs輸出,即

[1]  10079 

到控制檯的STD-錯誤。您需要一些額外的語法將其重定向到/ dev/null。這裏有一個例子:

COMMAND="sleep 10" 
{ $COMMAND & ; } 1>/dev/null 2>&1 

使用過程組({ .... ; }應該不會引起任何問題,但它可能

IHTH

2

的符號添加到通話結束。

eval $COMMAND & 
3

嘗試:

command="java -jar jenkins.war" 
echo "starting service" 
$command </dev/null >jenkins.out 2>jenkins.err & 
echo "service running" 
相關問題