Ctrl + C, чтобы завершить grunt watch, но убивает редактор Atom, который запустился из того же bash, почему?

У меня есть этот скрипт с именем wsjs.sh:

#!/bin/bash
WS=/home/user/wsjs
cd $WS
nohup atom . & 
gnome-terminal
grunt watch

Если я запускаю его в bash:

./wsjs.sh

Затем редактор атома, gnome-терминал запускаются отдельно, и текущий bash показывает:

user@ubuntu:~$ ./wsjs.pwd 
nohup: appending output to ‘nohup.out’
Running "watch" task
Waiting...

Теперь, если я нажимаю ctrl + c, grunt watch закрывается, НО редактор атомов также закрывается.

... это странно.

Я вручную ввел каждую команду в bash, и атом НЕ был закрыт. Я заменил атом на gedit и запустил скрипт, он НЕ был закрыт.

Почему атом был закрыт? Спасибо!


person theme    schedule 31.05.2015    source источник
comment
Вы можете перехватить ctrl+c и самостоятельно отменить только команду grunt watch.   -  person Dan    schedule 02.06.2015
comment
Ваш ctrl+c не убивает отдельную программу, запущенную из скрипта, — он убивает весь скрипт. Если вы хотите, чтобы запуск ./wsjs.pwd вел себя так же, как запуск команд в нем по отдельности, запустите source wsjs.pwd вместо ./wsjs.pwd.   -  person Charles Duffy    schedule 02.06.2015


Ответы (2)


Это происходит потому, что при выполнении сценария оболочки он имеет идентификатор процесса, а команда внутри выполнения файла будет иметь идентификатор родительского процесса файла сценария. Таким образом, при завершении файла сценария Ctl+C он также завершает дочерние процессы (в вашем случае

cd $WS
nohup atom . & 
gnome-terminal
grunt watch

) При выполнении отдельной команды имеют независимые идентификаторы процессов.

Надеюсь, вы уловили идею.

person M S Parmar    schedule 02.06.2015
comment
nohup без явного перенаправления считается плохой практикой, поскольку создает nohup.out файлов. Пожалуйста, подумайте о том, чтобы сделать что-то явное с stdout и stderr из atom или использовать disown вместо nohup. - person Charles Duffy; 02.06.2015
comment
Прочитав это, я начал сомневаться, что gedit имеет странное поведение, а затем обнаружил следующее: subprocesses-of-bash-gnome-terminal-dont-terminate-centos-rhel . Думаю, теперь у меня есть полная история за кулисами, большое спасибо. - person theme; 03.06.2015
comment
@theme: этот ответ неверен. Дочерние процессы обычно не завершаются, когда родитель завершает работу. (См., например, stackoverflow.com/questions/284325/) Вы можете видеть нормальное поведение с gedit, xclock и т. д. --- Но есть особый случай: дочерние процессы получают SIGHUP, когда их лидер сеанса завершается. Пример: в Ubuntu откройте терминал (Ctrl+Alt+t), запустите xclock &, затем закройте терминал, используя At+F4, xclock также завершается из-за SIGHUP. ------ Редактор Atom ведет себя странно, и я не знаю, почему. - person pabouk; 30.06.2015

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

Если это действительно ваше намерение, то не бегите

./wsjs.pwd

... который запускает скрипт в собственной оболочке; вместо этого беги

source wsjs.pwd

...или его POSIX-совместимый эквивалент,

. wsjs.pwd ## the space is not a typo!

... который запускает скрипт в вашей уже существующей оболочке.

person Charles Duffy    schedule 02.06.2015