[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.
Rispondi
Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

[RISOLTO] BASH uccidere processi in background da script

Messaggio da lamarozzo »

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 22 set 2010, 13:16, modificato 1 volta in totale.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: BASH uccidere processi in background da script

Messaggio da targzeta »

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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

Re: BASH uccidere processi in background da script

Messaggio da lamarozzo »

Ciao spina,
grazie, ma quello che mi serve è fare le operazioni all'interno di uno script bash.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: BASH uccidere processi in background da script

Messaggio da targzeta »

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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
lamarozzo
Linux 3.x
Linux 3.x
Messaggi: 732
Iscritto il: gio 14 lug 2005, 0:00
Desktop: xfce
Distribuzione: archlinux
Località: Roma

Re: BASH uccidere processi in background da script

Messaggio da lamarozzo »

Grazie spina,
funziona benissimo. Cosa sarebbe il forum senza di te! :D

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

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

Messaggio da ZeroUno »

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
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

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

Messaggio da targzeta »

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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
ZeroUno
Staff
Staff
Messaggi: 5441
Iscritto il: ven 2 giu 2006, 14:52
Nome Cognome: Matteo Rossini
Slackware: current
Kernel: slack-current
Desktop: ktown-latest
Distribuzione: 01000000-current
Località: Roma / Castelli
Contatta:

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

Messaggio da ZeroUno »

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
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

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

Messaggio da targzeta »

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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Rispondi