En bref
Avec &
et disown
vous ne modifiez pas le PID du processus.
Si vous ne le voyez pas dans le ps -p <YOURPID>
sortie, il ne tourne plus.
Vous pouvez survérifier avec un echo $?
supplémentaire après le ps
(ou kill
) commande, vérifiant si le programme se termine avec un code de sortie différent de 0
(généralement 1
).
Comprendre vos commandes.
-
Contexte :lorsque vous lancez la commande avec le
&
final vous l'envoyez en arrière-plan.
Cela signifie que :- Il est présent dans la liste des jobs de votre shell (dans votre exemple c'est le numéro
[1]
et vous pouvez vous y référer en tant que%1
; (essayez la commandejobs
). - Vous pouvez l'amener au premier plan et en arrière-plan avec
fg
etbg
. -
Il est (toujours) "possédé" par le shell (lié au parent) :si le shell reçoit un
SIGHUP
signal, il enverra unSIGHUP
signal au processus aussi.$ 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
- Il est présent dans la liste des jobs de votre shell (dans votre exemple c'est le numéro
-
Renier :avec la commande
disown
vous supprimez le travail de la liste des travaux du shell, mais vous ne modifiez pas son 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
Notez le même PPID (le shell existe toujours).
Maintenant, nous tuons la coquille.$ 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
Il y a un autre
PPID
, le5339
, cela avec une autre invocation deps
,ps -p 5339
, vous découvrirez que vous êtes uninit
instance :$ ps -p 5339 PID TTY TIME CMD 5339 ? 00:02:20 init
pstree
:un moyen plus rapide.
Vous pouvez voir avec pstree
plus rapidement.
Avant le disown
et tuez le bash commandes :
$ pstree -s -p 10795
init(1)───lightdm(1199)───lightdm(5259)───bash(8380)───sleep(10795)
Après le disown
et tuez le bash :
$ pstree -s -p 10795
init(1)───lightdm(1199)───lightdm(5259)───init(5339)───sleep(10795)
Remarque : bien sûr tous les PID dans votre cas seront différents...
Si ce n'est pas dans ps auxf
, alors il ne fonctionne pas. Si vous exécutez kill 29144
et obtenez "Aucun processus de ce type", cela signifie également que le processus n'est pas en cours d'exécution.
Chaque processus a un dossier dans le /proc
système de fichiers avec son pid
. Si le dossier n'existe pas, le processus n'est pas en cours d'exécution.
Par exemple
/proc/29144/
vous pouvez voir le processus commandline
cat /proc/29144/cmdline
exemple de sortie :
/usr/sbin/smbd
ou vérifier l'état du fichier de processus
stat /proc/29144/exe
exemple de sortie :
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: -