Thử:
#!/bin/bash
_term() {
echo "Caught SIGTERM signal!"
kill -TERM "$child" 2>/dev/null
}
trap _term SIGTERM
echo "Doing some initial work...";
/bin/start/main/server --nodaemon &
child=$!
wait "$child"
Thông thường, bash
sẽ bỏ qua mọi tín hiệu trong khi một tiến trình con đang thực thi. Bắt đầu từ các máy chủ với &
ý chí nền nó vào hệ thống điều khiển công việc của vỏ, với $!
tổ chức PID của máy chủ (được sử dụng với wait
và kill
). wait
Sau đó, việc gọi sẽ chờ công việc với PID (máy chủ) được chỉ định kết thúc hoặc cho bất kỳ tín hiệu nào được kích hoạt .
Khi shell nhận được SIGTERM
(hoặc máy chủ thoát độc lập), wait
cuộc gọi sẽ trở lại (thoát với mã thoát của máy chủ hoặc với số tín hiệu + 128 trong trường hợp nhận được tín hiệu). Sau đó, nếu shell nhận được SIGTERM, nó sẽ gọi _term
hàm được chỉ định là trình xử lý bẫy SIGTERM trước khi thoát (trong đó chúng tôi thực hiện bất kỳ việc dọn dẹp nào và truyền tín hiệu thủ công đến quy trình máy chủ bằng cách sử dụng kill
).