2015-05-31 5 views
6

Ho questo script chiamato :Ctrl + C per terminare "grunt watch", ma uccide l'editor di Atom che è partito dalla stessa bash, perché?

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

Se l'eseguo in bash:

./wsjs.sh 

Poi editor di atomo, gnome-terminal vengono avviati a parte, e la corrente che mostra bash:

[email protected]:~$ ./wsjs.pwd 
nohup: appending output to ‘nohup.out’ 
Running "watch" task 
Waiting... 

Ora se si preme ctrl + c, grunt watch si chiude, ma anche l'editor di atomi BUT è chiuso.

... questo è strano.

Ho inserito manualmente tutti i comandi in bash e l'atomo NON era chiuso. Ho sostituito atomo con gedit e ho eseguito lo script, NON è stato chiuso.

Perché è stato chiuso Atom? Grazie!

+1

È possibile [trap] (http://linuxcommand.org/wss0160.php) il ctrl + c e gestirlo manualmente per annullare solo il comando di controllo grunt. – dan08

+0

Il tuo ctrl + c non sta uccidendo un singolo programma eseguito dallo script - sta uccidendo lo _whole script_. Se si desidera eseguire './Wsjs.pwd' in modo che si comporti come nell'eseguire i comandi in esso singolarmente, eseguire' source wsjs.pwd' invece di './Wsjs.pwd'. –

risposta

3

Questo perché, durante l'esecuzione dello script di shell, ha un ID di processo e un comando all'interno del file in esecuzione avrà un id del file di script genitore. Così, mentre estinzione o di file di script Ctl + C, ma anche terminare i processi figlio così (Nel tuo caso

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

) Durante l'esecuzione di comandi individuali hanno ID di processo indipendenti.

Spero che tu abbia avuto l'idea.

+0

'nohup' senza reindirizzamento esplicito è considerato una cattiva pratica, poiché crea file' nohup.out'. Per favore considera di fare qualcosa di esplicito con stdout e stderr da 'atom', o usando' disown' invece di 'nohup'. –

+0

Dopo aver letto questo, ho iniziato a dubitare che sia gedit che ha uno strano comportamento, quindi trovo questo: "[subprocesses-of-bash-gnome-terminal-dont-terminate-centos-rhel] (http: // unix. stackexchange.com/questions/94277/subprocesses-of-bash-gnome-terminal-dont-terminate-centos-rhel) ". Credo che ora ho tutta la storia dietro le quinte, grazie molte. – theme

+0

@theme: questa risposta è errata.I processi figli non vengono normalmente terminati quando il genitore termina. (Vedi ad esempio http://stackoverflow.com/questions/284325/how-to-make-child-process-die-after-parent-exits) Puoi vedere il comportamento normale con 'gedit',' xclock' ecc. --- Ma c'è un caso speciale: i processi figli ricevono 'SIGHUP' quando il loro leader di sessione è terminato. Esempio: in Ubuntu open terminal (Ctrl + Alt + t), esegui 'xclock &' e chiudi il terminale usando At + F4, 'xclock' termina anche a causa di' SIGHUP'. ------ L'editor di Atom si comporta in modo strano e non so perché. – pabouk

2

Mi rendo conto che ci si aspetta che l'esecuzione dello script si comporti esattamente nello stesso modo in cui si eseguono i comandi al suo interno in una shell interattiva.

Se questo è davvero il vostro intento, allora non eseguire

./wsjs.pwd 

... che esegue lo script nel proprio guscio; invece, eseguire

source wsjs.pwd 

... o il suo equivalente POSIX-compliant,

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

... che esegue lo script nella shell preesistente.

Problemi correlati