簡體   English   中英

通過shell腳本運行多個后台進程

[英]Running multiple background processes through shell scripting

我是shell腳本的新手,所以請原諒我缺乏知識。

我的目標是在后台運行兩個服務器server1server2 ,然后通過我的shell腳本運行python腳本scriptRun

步驟1:

  • 啟動server1(使其在后台運行)

  • 在此服務器上運行一些命令(這​​些是自定義命令)

第2步:

  • 啟動server2

第三步:

  • 啟動server1和server2后,運行我的python腳本並在終端上顯示其輸出

我的shell腳本如下所示:

echo "Launching server1"
java StartServer1.jar && (serverCommand1 && serverCommand2) &

echo "Launching server2"
java StartServer2.jar &&

echo "Running script"
python scriptRun.py

這個腳本根本不起作用。 我嘗試刪除serverCommand1和serverCommand2,這可行,但python腳本不等待server2啟動。

終端還顯示server1和server2的輸出,而不是python腳本的輸出。

我的問題是如何在后台運行多個進程並運行另一個依賴於先前進程的進程?

腳本中的&&似乎有點混亂。 作為記錄:

  • 放置一個& after命令后台運行它
  • &&用於鏈接多個命令(如果成功),例如cmd1 && cmd2將執行cmd1並且僅當它成功退出時才會執行cmd2 兩個命令都將在前台運行,這里根本沒有背景。

也許你想做這樣的事情:

echo "Launching server1"
java StartServer1.jar >server1.log 2>server1.err
sleep 5  # give some time for the server to come up

serverCommand1
serverCommand2

echo "Launching server2"
java StartServer2.jar >server2.log 2>server2.err
sleep 5  # give some time for the server to come up

echo "Running script"
python scriptRun.py

實際上,如果您能夠檢測到服務器已准備好並對此做出反應,那么最好不要在一段固定的時間內休眠。 例如,在日志中,可能會有一條消息指示服務器已准備就緒,讓我們說一條消息“READY”。 然后你可以做這樣的事情:

echo "Launching server1"
java StartServer1.jar >server1.log 2>server1.err
while :; do sleep 5; grep -q READY server1.log && break; done

那是一個無限循環,在每次睡眠中它都會休眠5秒並檢查日志是否包含文本“READY”。 如果是,它結束循環。 你可以想出一個適合你需求的變體。

在執行python腳本之前,您需要wait后台進程完成。 另外,如果要忽略這些,請將STDOUTSTDERR從java進程重定向到/dev/null

echo "Launching server1"
java StartServer1.jar >/dev/null 2>&1 &

echo "Launching server2"
java StartServer2.jar >/dev/null 2>&1 &

wait     # wait for the background processes to complete

echo "Running script"
python scriptRun.py

(我不確定您的服務器命令是如何工作的,但是如果您需要向它發出命令,則可能需要在啟動server1后wait 。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM