shell腳本吧我有一個腳本foo
,如果提供參數start
,開始,除其他事情的背景和退出腳本bar
- bar
包含一個無限循環。終止從foo腳本
在稍後階段,我想撥打foo
並將參數stop
與我想要的腳本bar
,仍然運行在後臺停止運行。
什麼是實現這個文本書的方式?
shell腳本吧我有一個腳本foo
,如果提供參數start
,開始,除其他事情的背景和退出腳本bar
- bar
包含一個無限循環。終止從foo腳本
在稍後階段,我想撥打foo
並將參數stop
與我想要的腳本bar
,仍然運行在後臺停止運行。
什麼是實現這個文本書的方式?
如果多個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
很好的解決方案,謝謝!有一個問題:在停止部分,我們不應該刪除pidfile作爲最後的指令嗎?否則,我們總是會在echo「$ pidfile exists」結束。案例 – user695652
你是對的,很好地發現。修正了,謝謝。 – randomir
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。這可能更容易,但也可能更脆弱。
當你運行'foo start'並且'bar'的一個實例已經在運行時會發生什麼? – randomir