Repository 32bit  Forum
Repository 64bit  Wiki

[RISOLTO] BASH uccidere processi in background da script

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

[RISOLTO] BASH uccidere processi in background da script

Messaggioda lamarozzo » mer set 22, 2010 11:29

Ciao,
purtroppo la mia conoscenza del bash è soltanto superficiale e stavo cercando di scrivere uno script che faccia le seguenti operazioni

Codice: Seleziona tutto
./comando1 &

./comando2

./uccidi_comando1


Quindi comando1 deve andare in background (è un comando che non termina mai - in sostanza apre una connessione), comando2 fa quello che deve fare e quando ha finito il comando1 deve essere ucciso.

Una soluzione potrebbe essere quella di prendere il PID del comando1 e poi dare il kill. Ma qualunque altra soluzione andrebbe benissimo. Qualcuno mi può dare una mano?
Ultima modifica di lamarozzo il mer set 22, 2010 12:16, modificato 1 volta in totale.
Avatar utente
lamarozzo
Linux 2.6
Linux 2.6
 
Messaggi: 732
Iscritto il: mer lug 13, 2005 23:00
Località: Roma
Desktop: xfce
Distribuzione: archlinux

Re: BASH uccidere processi in background da script

Messaggioda targzeta » mer set 22, 2010 11:35

Codice: Seleziona tutto
comando 1&
comando 2
(terminato comando 2)
fg
crtl-c

Se hai più processi in bg, allora puoi lavorare con il comando 'jobs', controllando il numero del processo che vuoi portare in fg e poi terminandolo con crtl-c.

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6155
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: BASH uccidere processi in background da script

Messaggioda lamarozzo » mer set 22, 2010 11:37

Ciao spina,
grazie, ma quello che mi serve è fare le operazioni all'interno di uno script bash.
Avatar utente
lamarozzo
Linux 2.6
Linux 2.6
 
Messaggi: 732
Iscritto il: mer lug 13, 2005 23:00
Località: Roma
Desktop: xfce
Distribuzione: archlinux

Re: BASH uccidere processi in background da script

Messaggioda targzeta » mer set 22, 2010 11:55

Allora:
Codice: Seleziona tutto
comando1 &
comando 2
(temina il comando2)
kill -s 9 $!
dal man di bash:
$! Expands to the process ID of the most recently executed background (asynchronous) command.
Quindi nota che si espande al PID dell'ultimo comando mandato in bg.

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6155
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: BASH uccidere processi in background da script

Messaggioda lamarozzo » mer set 22, 2010 12:04

Grazie spina,
funziona benissimo. Cosa sarebbe il forum senza di te! :D
Avatar utente
lamarozzo
Linux 2.6
Linux 2.6
 
Messaggi: 732
Iscritto il: mer lug 13, 2005 23:00
Località: Roma
Desktop: xfce
Distribuzione: archlinux

Re: [RISOLTO] BASH uccidere processi in background da script

Messaggioda ZeroUno » mer set 22, 2010 18:38

un'altra soluzione similissima è
Codice: Seleziona tutto
comando1 & PID1=$!
comando 2
(temina il comando2)
kill $PID1

che è necessaria se tra comando1 e kill ci sono altri processi in background.
poi evito il kill -9 finchè non mi è necessario.
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4345
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: [RISOLTO] BASH uccidere processi in background da script

Messaggioda targzeta » mer set 22, 2010 19:33

Sono d'accordo con te 01, ho usato il SIGKILL perchè facendo una prova senza ho notato qualcosa di strano:
Codice: Seleziona tutto
$> nano casa&
[1] 11118

$>  kill $!
[1]+  Stopped                 nano casa

$> ps x
....
11118 pts/2    T      0:00 nano casa
....
Non me lo so spiegare, quindi ho optato per il SIGKILL. Comunque può darsi che sia nano ha gestire il segnale SIGTERM (quello di default).

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6155
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [RISOLTO] BASH uccidere processi in background da script

Messaggioda ZeroUno » gio set 23, 2010 9:20

mi sembra piuttosto normale che ti va in stopped, e non per il kill.
riprova:
Codice: Seleziona tutto
$ nano casa&
[1] 23274
$ <INVIO>

[1]+  Stopped                 nano casa

Quando un programma che sta in background si aspetta un input da tastiera (e nano è un editor), questo va in stopped perchè chiaramente in background non può arrivargli nessun output sensato.
Il fatto che te lo mostra dopo il kill è un puro caso, o meglio, un processo che butti in background ti da messaggi di interrupt&co solamente quando premi invio nella shell.


Il SIGTERM è un modo soft di chiudere un programma.. gli dice 'effettua la chiusura' (come se premi con la X su una finestra) e il programma decide di chiudersi (può cachare l'interrupt e fare le sue operazioni di chiusura o non chiudersi affatto). Sta di fatto che un processo STOPPED non può fare operazioni, quindi lì rimane.
Il SIGKILL non dice 'chiuditi' al programma, ma dice al kernel 'chiudilo'; non importa cosa stia facendo o non stia facendo il programma; il kernel libera memoria e risorse e lo toglie brutalmente dalla tabella dello scheduler (a meno che non riesce a liberare le risorse di I/O perchè queste non rispondono alla chiusura; in tal caso uccidi il processo solamente con un reboot.... se ti basta; io ho avuto difficoltà a fare il reboot con un hardware che non rispondeva).

Ciao
01
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111
Avatar utente
ZeroUno
Staff
Staff
 
Messaggi: 4345
Iscritto il: ven giu 02, 2006 13:52
Località: Roma / Castelli
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current

Re: [RISOLTO] BASH uccidere processi in background da script

Messaggioda targzeta » gio set 23, 2010 9:27

Quello che volevo sottolineare non era lo 'stopped', ma il fatto che non viene eliminato dalla tabella dei processi, vedi il comando 'ps'. In pratica succede che il processo non termina. Come dici te: "quindi lì rimane."

Per il resto sono d'accordo con te,
Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6155
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti