Почему Ctrl + C в консоли убивает фоновый процесс

5

Не могли бы вы объяснить, почему Ctrl + С в моем bash shell влияет на команду, которая была ранее запущена в фоновом режиме с помощью

`./my_script.sh 1` &

Команда немедленно заканчивает выполнение 130 код:

[1]+  Exit 130              `./my_script.sh 1` &

Обычное поведение Ctrl + С это убить процесс переднего плана. И что здесь происходит?

Редактировать 1: (мои мысли) может быть, что-то связано с обратными галочками - здесь начинается процесс дочерней оболочки, и он как-то получает Ctrl + С когда родительский процесс получит его

Редактировать 2: я обнаружил, что Ctrl + С останавливает все фоновые процессы, запущенные из текущей оболочки с использованием обратных галочек.

John_West
источник
Это была предыдущая команда, введенная в вашу оболочку?
bgStack15
@bgStack Не понимаю: это ./my_script.sh 1 & Амп; , Или вы спрашиваете о последней команде перед Ctrl-C?
John_West
Забыл убежать от галочек в предыдущем комментарии. Следует читать как: `./my_script.sh 1` &
John_West

Ответы:

1

Когда вы пишете команду

`./my_script.sh 1` &

ты делаешь подстановка команд (увидеть ниже).
Практически вы выполняете подоболочка (тот, который для спины `` ) в фоновом режиме ( & ) в котором запускается ваш скрипт ( ./my_script.sh 1 ).

настоящая оболочка ожидает окончания выполнения его подоболочки, чтобы запустить ее вывод в виде команд.
подоболочка ждет конца вашего сценария.
когда вы нажимаете Ctrl + С вы прерываете это ожидание, передавая сигнал SIGINT ребенку.

В этот момент текущая оболочка пытается запустить в качестве команды вывод, полученный до сих пор ... и выдает ошибку 130 это означает «Сценарий прекращен с помощью Control-C» [ 2 ] ,


С клюшки ``, а также с $()в Bash вы делаете подстановка команд [ 1 ] :

Bash выполняет расширение, выполняя команду COMMAND и заменяя подстановку команды стандартным выводом команды, при этом удаляются все завершающие символы новой строки.

например

echo `date`   
Thu Feb 6 10:06:20 CET 2003 

Обратите внимание, что если вы запускаете в фоновом режиме больше таких команд

`./myscript 1` &
`./myscript 2` &
`./myscript 3` &

это всегда текущая оболочка, которая ожидает всех выходных данных дочерних элементов. Один Ctrl + С закончится это ожидание всех вместе.

Если вместо этого вы будете ждать конца скрипта, текущая оболочка попытается выполнить свой вывод, как только он завершит работу.

Hastur
источник
Да, это действительно выполняет вывод! Спасибо за объяснение! И это "передача сигнала SIGINT ребенку "поведение по умолчанию bash? Или только при использовании подстановки команд?
John_West
1
Второй вы сказали. Кстати сделать некоторые тесты ... sleep 10; echo ok как скрипт ... &... ctrl c ... приятно провести время!
Hastur