儘管程序仍在執行,但父 bash 腳本未收到“陷阱”
我實際上想要實現的目標:
我正在嘗試讓自定義守護程序在使用 SysVinit 的系統上執行。我已經有引導程序
/etc/init.d/xyz
腳本,它呼叫我的守護程序,但它不會自動將它放在後台。這類似於服務的nginx
行為方式:二進制背景本身 - 即/etc/init.d/nginx
腳本不負責守護程序,因此如果您/opt/nginx/sbin/nginx
直接執行,您也會遇到守護程序/後台執行。問題
我的問題是,使用我目前的方法,守護程序不會隨父程序終止(當您呼叫 時,它會終止
service xyz stop
)。我正在使用
launcher.sh
執行腳本的父daemon.sh &
腳本。然而,當我殺死繼續執行時,儘管我盡了最大努力launcher.sh
(它根本不會被呼叫):daemon.sh``trap
-> 啟動器.sh
#!/bin/bash function shutdown { # Get our process group id PGID=$(ps -o pgid= $$ | grep -o [0-9]*) echo THIS NEVER GETS CALLED! # Kill process group in a new process group setsid kill -- -$$ exit 0 } trap "shutdown" SIGTERM # Run daemon in background ./daemon.sh &
-> 守護程序.sh
#!/bin/bash while true do sleep 1 done
執行和殺死:
./launcher.sh <get PID for launcher> kill -TERM 123 # PID of launcher.sh... which _is_ still running and has its own PID.
結果:
daemon.sh
仍在執行並且shutdown
函式永遠不會被呼叫 - 我之前已經通過echo here
在函式體中放置一個來確認這一點。有任何想法嗎?
*編輯:*腳本
launcher.sh
正在使用 執行daemon launcher.sh
,其中daemon
是 Amazon Linuxinit.d/functions
文件提供的函式(參見此處: http: //gist.github.com/ljwagerfield/ab4aed16878dd9a8241b14bc1501392 f)。
該
trap
命令僅在腳本執行時才有效。通常這樣做的方式是,當守護程序被分叉時,它將其 PID 寫入文件。然後,init 腳本要麼使用該文件來確定要終止的程序,要麼呼叫您的啟動器腳本來終止該程序。
對於第一種情況:
launcher.sh:
/path/to/daemon.sh & echo "$!" > /var/run/xyz.pid
一個簡單且有點幼稚的版本
/etc/init.d/xyz
:# ... pull in functions or sysconfig files ... start() { # ... do whatever is needed to set things up to start ... /path/to/launcher.sh } stop() { # ... do whatever is needed to set things up to stop ... kill `cat /var/run/xyz.pid` } # ... other functions ...
非天真的啟動腳本將取決於您正在執行的 linux 版本;我建議查看其他範例,
/etc/init.d
看看他們是如何做到這一點的。