2017-08-16 135 views
3

shell腳本吧我有一個腳本foo,如果提供參數start,開始,除其他事情的背景和退出腳本bar - bar包含一個無限循環。終止從foo腳本

在稍後階段,我想撥打foo並將參數stop與我想要的腳本bar,仍然運行在後臺停止運行。

什麼是實現這個文本書的方式?

+0

當你運行'foo start'並且'bar'的一個實例已經在運行時會發生什麼? – randomir

回答

2

如果多個bar情況下可以同時運行,並foo stop應停止/把他們全部殺死,用pkill

$ pkill bar 

殺死名爲bar所有進程。

如果只有一個bar實例被允許運行,帶有「pidfile」的解決方案將是可行的。

foo

pidfile=/var/run/bar.pid 

if ((start)); then 
    if [ -e "$pidfile" ]; then 
     echo "$pidfile exists." 
     # clean-up, or simply abort... 
     exit 1 
    fi 
    bar & 
    echo $! >"$pidfile" 
fi 

if ((stop)); then 
    if [ ! -e "$pidfile" ]; then 
     echo "$pidfile not found." 
     exit 1 
    fi 
    kill "$(<"$pidfile")" 
    rm -f "$pidfile" 
fi 
+1

很好的解決方案,謝謝!有一個問題:在停止部分,我們不應該刪除pidfile作爲最後的指令嗎?否則,我們總是會在echo「$ pidfile exists」結束。案例 – user695652

+0

你是對的,很好地發現。修正了,謝謝。 – randomir

0

There are better ways to do what you're trying to do I believe如果你的主機已經systemd或INITD已經有框架到位,有啓動長時間運行工作/停止功能。

如果你必須這樣做獨立的或其他有用的工具,我會解決這個問題是這樣的:

當你調用foo start店的新衍生bar過程的一個文件中的PID,讓我們把它叫做pidfile。這也可以是一個新行分隔的PID列表。

當你調用foo stop使用pkill -F pidfile殺死所有正在運行的進程的PID與匹配那些pidfile

另外,您可以使用pkill到dicover符合特定條件時,你叫foo stop所有進程的PID。這可能更容易,但也可能更脆弱。