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: 13079
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

bash, pid e ultimo processo

Messaggioda conraid » mer ott 12, 2016 9:45

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: 3293
Iscritto il: ven ott 12, 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

Messaggioda Blallo » mer ott 12, 2016 13:26

Per non saper leggere o scrivere, proverei a mettere una sleep(1), magari esegue il comando quando FF non è ancora nella lista dei processi.
My DWM configuration: https://github.com/8lall0/dwm

Feel free to use.

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

Re: bash, pid e ultimo processo

Messaggioda Ansa89 » gio ott 13, 2016 9:33

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: 13079
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: bash, pid e ultimo processo

Messaggioda conraid » gio ott 13, 2016 12:26

Così lo script non termina mai :/

metrofox
Linux 3.x
Linux 3.x
Messaggi: 760
Iscritto il: gio ago 07, 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

Messaggioda metrofox » gio ott 13, 2016 12:52

$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: 13079
Iscritto il: gio lug 14, 2005 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Località: Livorno
Contatta:

Re: bash, pid e ultimo processo

Messaggioda conraid » gio ott 13, 2016 14:13

È 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 ago 07, 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

Messaggioda metrofox » gio ott 13, 2016 15:44

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

Re: bash, pid e ultimo processo

Messaggioda targzeta » gio ott 13, 2016 20:01

Prova con pgrep/pkill

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

Re: bash, pid e ultimo processo

Messaggioda conraid » ven ott 14, 2016 9:09

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 ago 29, 2007 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena
Contatta:

Re: bash, pid e ultimo processo

Messaggioda Ansa89 » ven ott 14, 2016 10:42

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

Re: bash, pid e ultimo processo

Messaggioda targzeta » ven ott 14, 2016 18:30

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

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

Re: bash, pid e ultimo processo

Messaggioda conraid » sab ott 15, 2016 11:13

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

Re: bash, pid e ultimo processo

Messaggioda targzeta » sab ott 15, 2016 19:49

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

Re: bash, pid e ultimo processo

Messaggioda conraid » dom ott 16, 2016 7:51

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

Re: bash, pid e ultimo processo

Messaggioda targzeta » dom ott 16, 2016 10:39

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
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à