Pagina 1 di 2

bash, pid e ultimo processo

Inviato: mer 12 ott 2016, 9:45
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.

Re: bash, pid e ultimo processo

Inviato: mer 12 ott 2016, 13:26
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.

Re: bash, pid e ultimo processo

Inviato: gio 13 ott 2016, 9:33
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

Re: bash, pid e ultimo processo

Inviato: gio 13 ott 2016, 12:26
da conraid
Così lo script non termina mai :/

Re: bash, pid e ultimo processo

Inviato: gio 13 ott 2016, 12:52
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`

Re: bash, pid e ultimo processo

Inviato: gio 13 ott 2016, 14:13
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

Re: bash, pid e ultimo processo

Inviato: gio 13 ott 2016, 15:44
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

Re: bash, pid e ultimo processo

Inviato: gio 13 ott 2016, 20:01
da targzeta
Prova con pgrep/pkill

Emanuele

Re: bash, pid e ultimo processo

Inviato: ven 14 ott 2016, 9:09
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.

Re: bash, pid e ultimo processo

Inviato: ven 14 ott 2016, 10:42
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)

Re: bash, pid e ultimo processo

Inviato: ven 14 ott 2016, 18:30
da targzeta
Io intendevo di usare pgrep come test e poi pkill per effettivamente killare il processo una volta che la regex funziona.

Emanuele

Re: bash, pid e ultimo processo

Inviato: sab 15 ott 2016, 11:13
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.

Re: bash, pid e ultimo processo

Inviato: sab 15 ott 2016, 19:49
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

Re: bash, pid e ultimo processo

Inviato: dom 16 ott 2016, 7:51
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?

Re: bash, pid e ultimo processo

Inviato: dom 16 ott 2016, 10:39
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