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
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
?
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
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?
Vuoi quello con il fg PaleGreen?
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
quando è cercato il PID il processo non c'è più
se faccio
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:
però solo root può scrivere in /var/run.
Emanuele