bash, pid e ultimo processo

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.
Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

bash, pid e ultimo processo

Messaggio da conraid »

Ho un problema con uno script che deve uccidere firefox che lancio subito prima, nello script stesso, appena lo chiudo (purtroppo a volte rimane in esecuzione ugualmente)

Ora il fatto è che non posso fare

Codice: Seleziona tutto

killall firefox
perché ho sia firefox normale, sia la versione dev, e a volte varie versioni di test (con profili diversi).
Un modo di prendere il pid allora l'ho trovato con

Codice: Seleziona tutto

ps -ef | grep firefox | grep firefox-dev | cut -d" " -f3
Ora però nello script se metto

Codice: Seleziona tutto

/opt/programmi/firefox-dev/firefox
PID=$(ps -ef | grep firefox | grep firefox-dev | cut -d" " -f3)
la variabile non ha il PID. Come posso mettere il PID di quel firefox lanciato con quel comando e così poter fare

Codice: Seleziona tutto

kill -9 $PID
?

Spero di essermi spiegato.


p.s.

Codice: Seleziona tutto

ps -ef | grep firefox | grep firefox-dev | cut -d" " -f3
è solo un esempio, visto che in questo caso potevo fare

Codice: Seleziona tutto

ps -ef | grep firefox-dev | cut -d" " -f3
ma a volte il comando è lanciato con una cosa simile

Codice: Seleziona tutto

./firefox --class Test Browser -profile path/profile.default
al che devo fare due grep, ma è solo un esempio, l'importante è prendere il PID giusto, non è questo il punto critico per me.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: bash, pid e ultimo processo

Messaggio da Blallo »

Per non saper leggere o scrivere, proverei a mettere una sleep(1), magari esegue il comando quando FF non è ancora nella lista dei processi.

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: bash, pid e ultimo processo

Messaggio da Ansa89 »

Codice: Seleziona tutto

/opt/programmi/firefox-dev/firefox
PID=$(ps -ef | grep firefox | grep firefox-dev | cut -d" " -f3)
while [ -z "$PID" ]; do
    sleep 1
    PID=$(ps -ef | grep firefox | grep firefox-dev | cut -d" " -f3)
done

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: bash, pid e ultimo processo

Messaggio da conraid »

Così lo script non termina mai :/

metrofox
Linux 3.x
Linux 3.x
Messaggi: 760
Iscritto il: gio 7 ago 2008, 12:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)
Località: London

Re: bash, pid e ultimo processo

Messaggio da metrofox »

$PID e' vuota in quanto non sempre becchi il campo giusto utilizzando whitespace come separatore da un output di ps.

Codice: Seleziona tutto

ps -ef --sort=start_time | grep 'firefox' | sed 's/ /\+/g'
Questo potrebbe funzionare:

Codice: Seleziona tutto

PID=`ps -ef --sort=start_time | grep 'firefox' | tail -1 | tr -s '[:space:]' | cut -d' ' -f2`

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: bash, pid e ultimo processo

Messaggio da conraid »

È sempre vuota ugualmente, anche con sleep di molti secondi.

Per ora ho utilizzato l'approccio opposto,

Codice: Seleziona tutto

PID=$(ps -ef --sort=start_time | grep 'firefox' | grep 'dev' | tail -1 | tr -s '[:space:]' | cut -d' ' -f2)
if [ $PID ]; then
    kill -9 $PID
fi
come primo comando dello script

però il dubbio di come sapere l'ID del processo avviato mi rimane. Ci sarebbe $!, ma non mi funziona in uno script, anche con
comando & ID=$!
non sempre lo prende

metrofox
Linux 3.x
Linux 3.x
Messaggi: 760
Iscritto il: gio 7 ago 2008, 12:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)
Località: London

Re: bash, pid e ultimo processo

Messaggio da metrofox »

Avvia il processo, successivamente, anche da riga di comando:

Codice: Seleziona tutto

ps -ef --sort=start_time | grep 'firefox' | grep 'dev' | tail -1 | tr -s '[:space:]' | cut -d' ' -f2
Vedi se il processo firefox-dev effettivamente esiste, controlla anche a mano con un semplice: ps -ef | grep firefox per vedere tutte le varianti del processo firefox.

Se questo output esiste allora:

Codice: Seleziona tutto

P_ID=$(ps -ef --sort=start_time | grep 'firefox' | grep 'dev' | tail -1 | tr -s '[:space:]' | cut -d' ' -f2)
if [ ! -z $P_ID ]; then
	kill -9 $P_ID
	res=$?
	if [ $res -eq 0 ]; then
		echo $P_ID killed succesfully
	else
		echo "Cannot kill $P_ID: $res"
	fi
else
	echo "P_ID is empty"
fi

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, pid e ultimo processo

Messaggio da targzeta »

Prova con pgrep/pkill

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: bash, pid e ultimo processo

Messaggio da conraid »

metrofox ha scritto:Avvia il processo, successivamente, anche da riga di comando:

Codice: Seleziona tutto

ps -ef --sort=start_time | grep 'firefox' | grep 'dev' | tail -1 | tr -s '[:space:]' | cut -d' ' -f2
Vedi se il processo firefox-dev effettivamente esiste, controlla anche a mano con un semplice: ps -ef | grep firefox per vedere tutte le varianti del processo firefox.

Se questo output esiste allora:

Codice: Seleziona tutto

P_ID=$(ps -ef --sort=start_time | grep 'firefox' | grep 'dev' | tail -1 | tr -s '[:space:]' | cut -d' ' -f2)
if [ ! -z $P_ID ]; then
	kill -9 $P_ID
	res=$?
	if [ $res -eq 0 ]; then
		echo $P_ID killed succesfully
	else
		echo "Cannot kill $P_ID: $res"
	fi
else
	echo "P_ID is empty"
fi

Da riga di comando esiste, è nello script che non prendo il pid, ma solo dopo il processo. Cioè se lo metto prima, e firefox-dev (è un esempio firefox-dev, stesso problema con Tor Browser per esempio, che ha sempre firefox come nome processo) è attivo allora lo uccide.
targzeta ha scritto:Prova con pgrep/pkill
Con pgrep da lo stesso problema, faccio prima a trovare il pid in realtà, ma non cambia il risultato.

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: bash, pid e ultimo processo

Messaggio da Ansa89 »

Si può provare a passare da "/proc":

Codice: Seleziona tutto

for i in `grep -R firefox /proc/*/cmdline | egrep -o "[0-9]*"` ; do
    if grep firefox-dev /proc/$i/cmdline &>/dev/null ; then
        PID="$i"
        break
    fi
done
Il codice forse è migliorabile, ma l'idea di fondo è quella.

Se anche così non ti trova il PID, può voler due cose:
- non hai i permessi di lettura su "/proc/PID"
- firefox è stato chiuso e rimosso dalla lista dei processi (che mi farebbe pensare che sia stato terminato correttamente)

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, pid e ultimo processo

Messaggio da targzeta »

Io intendevo di usare pgrep come test e poi pkill per effettivamente killare il processo una volta che la regex funziona.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: bash, pid e ultimo processo

Messaggio da conraid »

Allora, vi aggiorno sui tentativi.

Alla fine ho rinunciato perché c'era anche un problema concettuale nel mio script iniziale.
Se lancio il programma in background me lo ucciderebbe subito, se lo lancio normalmente lo script prende il pid quando firefox non c'è più. Perché anche se chiudo e quello rimane attivo lo script non va avanti, ho provato con vari echo. Potrei controllare con il file lock, ma mi torna meglio fare il controllo alla seconda invocazione.
Quindi lo uccido in cima allo script.
Però il modo di prendere il pid di un comando lanciato rimane. Tutte soluzioni più o meno valide, ma santo stalmann possibile che non si possa conoscere un pid preciso?
Come si vede da alcuni script di avvio o il programma ha il suo modo di creare pid, allora crea un file in /var/run e "uccidi quel pid", oppure ha un nome univoco (e con pidof non devi nemmeno fare grep o altre cose), ma in quel caso due programmi lanciati con stesso nome vanno in conflitto.

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, pid e ultimo processo

Messaggio da targzeta »

pgrep, non capisco perchè non ti piace. Fammi un esempio e vediamo. Guarda qua:

Codice: Seleziona tutto

$> ps o pid,cmd
PID COMMAND
...
513 xterm -bg #242424 -fg #99968b -g 115x59-0+0 +bc +sb -class my_top-s -e htop
514 xterm -bg #242424 -fg #99968b -g 95x32+0-26 +bc +sb -class watch_sockets -e watch_sockets.sh
517 xterm -bg #330019 -fg SandyBrown -g 88x28+0+0 -name <- -cr DarkOliveGreen
518 xterm -bg #000128 -fg PaleGreen -g 88x28-0+0 -name -> -cr firebrick3
519 xterm -bg #000009 -fg LemonChiffon -g 88x28+0-26 -T <_ -cr orange3 -e bash -c "cd ~/software_linux;screen"
520 xterm -bg #001000 -fg white -g 88x28-0-26 -name _> -cr ForestGreen
...
Vuoi il pid dell'xterm che lancia htop?

Codice: Seleziona tutto

$> pgrep -f xterm.*htop
513
Vuoi quello con il fg PaleGreen?

Codice: Seleziona tutto

$> pgrep -f xterm.*PaleGreen
518
Boh! Meglio di così, poi lanci pkill con gli stessi parametri e lo uccidi!

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: bash, pid e ultimo processo

Messaggio da conraid »

targzeta ha scritto:pgrep, non capisco perchè non ti piace.
Non è che non mi piace, il fatto è che è sempre un modo, più semplice, di trovare il pid.

Per es.
pgrep -f firefox.*Tor
mi trova il pid del browser Tor, ma ha lo stesso comportamento di ps e grep, cioè non ho il pid, ma come detto era un mio errore logico.

Trovare il PID di un processo lanciato, senza fare grep di ps o usare pgrep (perché per esempio voglio averlo in variabile) come faccio?

se faccio

Codice: Seleziona tutto

processo
PID=$(pgrep processo)
quando è cercato il PID il processo non c'è più
se faccio

Codice: Seleziona tutto

processo &
PID=$(pgrep processo)
allora, in teoria, c'è, ma se lo uccido magari uccide il processo quando ancora mi serve, ecco l'errore logico.

Quindi la domanda successiva è se c'è un modo per sapere il pid di un processo lanciato senza usare ps, tipo creare il file .pid come fanno alcuni programmi, ma fatto da shell/script anche se il programma non ha l'opzione per farlo?

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, pid e ultimo processo

Messaggio da targzeta »

Scusa ma non ho capito cosa vuoi fare. Comunque, se ti serve solo un wrapper per creare il pidfile allora non è difficile:

Codice: Seleziona tutto

#!/bin/bash
process&
echo $! > /var/run/process.pid
però solo root può scrivere in /var/run.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Rispondi