В последнее время я работаю над сценарием, который используется для запуска задания из файла, предположим следующую работу:
while true; do nc -l 8188 < index.html; done &
, когда я запустить его в интерактивной оболочки, и я получил PID эхо назад, как это:
[1] 31095
pstree(1)
выход:
Баш (31095, 31095) ---- н.д. (31096,31095)
как while
и команда nc(1)
находятся в одной группе процессов.
- Когда я типа
kill 30995
, положениеwhile
прекращается, как ожидалось, ноnc(1)
был оставлен. Я предполагаю, что оператор kill просто вызывает системный вызовkill(2)
. - Когда я набрал
kill %1
, вся группа процессов 31095 была убита. Я вещь, которая может вызыватьkillpg(2)
внутренне. - Когда я набираю 'fg', чтобы придать фон фронту, а затем наберите 'Ctrl-C', чтобы отправить сигнал прерывания, тогда и команда
while
, и командаnc(1)
исчезли, я думаю, это потому, что сигналINT
был отправлен к группе процессов, как описано в пункте 2.
Я также загружаю исходный код bash-4.3-бета, но исходного кода слишком много, и я не могу найти связанный материал. Может ли кто-нибудь помочь мне сделать мои мысли ясными?
Но когда я поставил вышеуказанное фоновое задание в сценарий, kill %1
не работает, как я уже догадывался. Вот скрипт (kill2.sh):
while true; do
nc -l 8888 < $0
done &
trap 'kill %1' INT TERM
wait || wait
Я бег это на bash kill2.sh
, а затем pstree -pg 31835
результата:
bash(31835, 31835) -- bash(31836, 31835) -- nc(31837, 31835)
, когда я печатаю ctrl-c
, 31835 и 31836 были убиты, но был н.д. оставил. Поэтому мне интересно, есть ли специальный случай для kill %1
в контексте скрипта?