In breve
Con &
e disown
non si modifica il PID del processo.
Se non lo vedi nel ps -p <YOURPID>
uscita, non è più in esecuzione.
Puoi controllare troppo con un ulteriore echo $?
dopo il ps
(o kill
), controllando se il programma esce con un codice di uscita diverso da 0
(tipicamente 1
).
Capire i tuoi comandi.
-
Sfondo :quando lanci il comando con il
&
finale lo mandi in background.
Ciò significa che:- È presente nell'elenco dei lavori della tua shell (nel tuo esempio è il numero
[1]
e puoi farvi riferimento come%1
; (prova il comandojobs
). - Puoi portarlo in primo piano e sullo sfondo con
fg
ebg
. -
È (ancora) "di proprietà" dalla shell (collegata alla madre):se la shell riceve un
SIGHUP
segnale, invierà unSIGHUP
segnale anche al processo.$ sleep 1h & [1] 10795 $ jobs [1]+ running sleep 1h & $ ps -l -p 10795 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 10795 8380 0 80 0 - 3107 hrtime pts/57 00:00:00 sleep
- È presente nell'elenco dei lavori della tua shell (nel tuo esempio è il numero
-
Rifiuto :con il comando
disown
rimuovi il lavoro dall'elenco dei lavori della shell, ma non cambi il suo PID.$ disown $ jobs # <---- No jobs $ ps -l -p 10795 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 10795 8380 0 80 0 - 3107 hrtime pts/57 00:00:00
Nota lo stesso PPID (la shell esiste ancora).
Ora uccidiamo il guscio.$ kill 8380 # Here we kill the shell $ ps -l -p 10795 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 10795 5339 0 80 0 - 3107 hrtime pts/57 00:00:00 sleep
C'è un altro
PPID
, il5339
, che con un'altra invocazione dips
,ps -p 5339
, scoprirai di essere uninit
istanza:$ ps -p 5339 PID TTY TIME CMD 5339 ? 00:02:20 init
pstree
:un modo più rapido.
Puoi vedere con pstree
più rapidamente.
Prima del disown
e uccidi il bash comandi:
$ pstree -s -p 10795
init(1)───lightdm(1199)───lightdm(5259)───bash(8380)───sleep(10795)
Dopo il disown
e uccidi il bash :
$ pstree -s -p 10795
init(1)───lightdm(1199)───lightdm(5259)───init(5339)───sleep(10795)
Nota: ovviamente tutti i PID nel tuo caso saranno diversi...
Se non è in ps auxf
, quindi non è in esecuzione. Se esegui kill 29144
e ottieni "No such process", che significa anche che il processo non è in esecuzione.
Ogni processo ha una cartella nel /proc
filesystem con pid
. Se la cartella non esiste, il processo non è in esecuzione.
Ad esempio
/proc/29144/
puoi visualizzare il processo commandline
cat /proc/29144/cmdline
output di esempio:
/usr/sbin/smbd
o controllare lo stato del file di processo
stat /proc/29144/exe
output di esempio:
File: /proc/29144/exe -> /usr/sbin/smbd
Size: 0 Blocks: 0 IO Block: 1024 symbolic link
Device: 3h/3d Inode: 78497 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-04-07 12:18:01.719011505 +0200
Modify: 2017-04-07 12:18:01.369010535 +0200
Change: 2017-04-07 12:18:01.369010535 +0200
Birth: -