注意:我以爲我使用bash,但/ bin/sh鏈接到/ bin/dash,它有這個奇怪的exec問題。如何找到dash-exec命令的PID
我在Linux上有一個簡單的bash shell腳本,用於啓動服務器進程(我沒有編寫或控制),並希望bash shell腳本將啓動的進程的PID輸出到pidfile。
問題是,bash-exec命令不會用啓動的服務器進程替換它自己的進程!
所以:
echo $$ | cat > /var/run/launched-server.pid
這並不不工作,因爲文件中的PID將是慶典的不是服務器進程。如果服務器進程退出bash,則可能無法退出,而將愚蠢的啓動腳本放在進程列表中。
有誰知道一種方式來使用bash(或者幾許?),這樣:
- 這可能嗎?
- 啓動服務器服務器進程的PID將在我的pidfile中?
- 確保啓動服務器存在時bash腳本將會死掉,並且不會在進程列表中留下閒置的shell進程?
編輯: 這從bash reference manual片段是用...
exec
exec [-cl] [-a name] [command [arguments]]
如果提供的命令,它取代了殼,而無需創建一個新的進程。如果提供了-l選項,那麼shell會在傳遞給命令的第零個參數的開始處放置一個破折號。這是登錄程序的功能。 -c選項使命令在空白環境下執行。如果提供了-a,那麼shell將名稱作爲命令的第零個參數。如果沒有指定命令,重定向可能會影響當前的shell環境。如果沒有重定向錯誤,則返回狀態爲零;否則返回狀態不爲零。
編輯2: 這是腳本(消毒):
#!/bin/sh
# this is where the server expects to run its services for Daemontools
SERVICE_DIR='/var/service';
# kill stdout, stderr, stdin
exec </dev/null
exec >/dev/null
exec 2>/dev/null
logger -ip daemon.debug -- stdout, stderr, stdin redirected to /dev/null
if [ -d $SERVICE_DIR ]; then
# sanitized...
logger -ip daemon.debug -- services and supervisors exited
else
logger -ip daemon.err -- $SERVICE_DIR does not exist, exiting
exit 1;
fi
if [ -d /var/run/pid ]; then
echo $$ | cat > /var/run/pid/launched-server.pid
logger -ip daemon.debug -- creating launched-server pidfile
fi
# start the server process
logger -ip daemon.info -- launching server on $SERVICE_DIR
exec /usr/local/bin/launched-server
而且有些ps輸出,也許更清楚了嗎?
[email protected]: ~/dev $ ps ax | grep launched-server
13896 pts/1 S+ 0:00 /bin/sh ./server_boot
13905 pts/1 S+ 0:00 launched-server /var/service
13938 pts/2 R+ 0:00 grep --color=auto launched-server
沒有必要使用'cat':'echo $$>/var/run/pid /已啓動server.pid' – 2010-09-01 15:45:08
@ Dennis-Williamson - 好,趕快,謝謝。 – Petriborg 2010-09-01 16:00:13