Linux

儘管程序仍在執行,但父 bash 腳本未收到“陷阱”

  • September 16, 2016

我實際上想要實現的目標:

我正在嘗試讓自定義守護程序在使用 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看看他們是如何做到這一點的。

引用自:https://serverfault.com/questions/803247