2015-12-03 4 views
1

В последнее время я работаю над сценарием, который используется для запуска задания из файла, предположим следующую работу:

while true; do nc -l 8188 < index.html; done & 

, когда я запустить его в интерактивной оболочки, и я получил PID эхо назад, как это:

[1] 31095 

pstree(1) выход:

Баш (31095, 31095) ---- н.д. (31096,31095)

как while и команда nc(1) находятся в одной группе процессов.

  1. Когда я типа kill 30995, положение while прекращается, как ожидалось, но nc(1) был оставлен. Я предполагаю, что оператор kill просто вызывает системный вызов kill(2).
  2. Когда я набрал kill %1, вся группа процессов 31095 была убита. Я вещь, которая может вызывать killpg(2) внутренне.
  3. Когда я набираю '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 в контексте скрипта?

ответ

0
  1. Когда я типа kill 30995, while раздел прекратившемуся, как ожидалось, но nc(1) был оставлен. I Предположим, что оператор kill просто вызывает систему kill(2) call.
  2. Когда я набрал kill %1, вся группа процессов 31095 была убита. Я вещь, которая может вызывать killpg(2) внутренне.
  3. Когда я типа «FG», чтобы привести фона к фронту, а затем введите «Ctrl-C», чтобы послать сигнал прерывания , то как пункт while и команду nc(1) ушел, я думаю, что это потому, что INT сигнал был отправлен в группу процессов, как описано в пункте , пункт 2.
  1. Это правда.
  2. Он может вызывать killpg(), но по крайней мере на Linux, killpg() реализован как функция библиотеки, которая делает вызов kill(-pgrp, sig).
  3. Действительно, если терминал является управляющим терминалом группы процессов переднего плана, символ прерывания приведет к отправке SIGINT в эту группу.

Но когда я ставлю выше фонового задания в сценарии, kill %1 не работает, как я догадывался больше. ... Так что мне интересно, есть ли в специальном случае для kill %1 в контексте скрипта?

The jobspec%1 может использоваться только при управлении заданий включен. Управление заданием по умолчанию отключено для неинтерактивных оболочек. Вы можете включить управление заданиями в скрипте, вставив команду set -m.

Смежные вопросы