Comment obtenir l'ID de processus pour tuer un processus nohup?

204

J'exécute un processus nohup sur le serveur. Lorsque j'essaye de le tuer, ma console de mastic se ferme à la place.

voici comment j'essaye de trouver l'ID du processus:

ps -ef |grep nohup 

c'est la commande de tuer

 kill -9 1787 787
user2535056
la source
6
Essayez-vous de le tuer à partir d'un script ou de la ligne de commande? Vous devez soit enregistrer le PID lorsque vous le faites nohupet l'utiliser plus tard pour le kill, soit rechercher le processus par son nom de commande dans la ps -efsortie et obtenir le PID à partir de cela. Vous devez chercher le nom de la commande, non nohup.
lurker
1
@mbratch Vous devriez en faire une réponse au lieu d'un commentaire.
Ansgar Wiechers
@AnsgarWiechers merci pour la suggestion. Parfois, si ma réponse est très brève ou si je ne suis pas sûr qu'elle couvre totalement ce que le PO demande, j'hésite à l'afficher comme réponse. J'ai ajouté une réponse et inclus plus d'informations.
lurker

Réponses:

353

Lorsque vous utilisez nohupet que vous placez la tâche en arrière-plan, l'opérateur d'arrière-plan ( &) vous donnera le PID à l'invite de commande. Si vous prévoyez de gérer manuellement le processus, vous pouvez enregistrer ce PID et l'utiliser plus tard pour tuer le processus si nécessaire, via kill PIDou kill -9 PID(si vous devez forcer la suppression). Alternativement, vous pouvez trouver le PID plus tard par ps -ef | grep "command name"et localiser le PID à partir de là. Notez que le nohupmot - clé / commande lui-même n'apparaît pas dans la pssortie de la commande en question.

Si vous avez utilisé un script, vous pourriez faire quelque chose comme:

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

Cela exécutera l' my_commandenregistrement de toutes les sorties my.log(dans un script, $!représente le PID du dernier processus exécuté). Le 2est le descripteur de fichier pour l' erreur - type ( stderr) et 2>&1indique la coque pour acheminer la sortie d'erreur standard à la sortie standard (descripteur de fichier 1). Cela nécessite &1que le shell sache qu'il s'agit d'un descripteur de fichier dans ce contexte au lieu d'un simple fichier nommé 1. Le 2>&1est nécessaire pour capturer tous les messages d'erreur qui sont normalement écrits en erreur standard dans notre my.logfichier (qui provient de la sortie standard). Voir Redirection d'E / S pour plus de détails sur la gestion de la redirection d'E / S avec le shell.

Si la commande envoie régulièrement une sortie, vous pouvez vérifier la sortie de temps en temps avec tail my.log, ou si vous voulez la suivre "en direct", vous pouvez l'utiliser tail -f my.log. Enfin, si vous devez tuer le processus, vous pouvez le faire via:

kill -9 `cat save_pid.txt`
rm save_pid.txt
rôdeur
la source
15
Une légère clarification, ce n'est pas en nohupsoi, qui imprime le PID, c'est la finale &qui le met en arrière-plan, par exemple ls &montrerait le PID pour la coursels
karmakaze
1
Que fait le «2> & 1»?
Viraj
4
@Viraj 2est le descripteur de fichier "erreur standard". >est la redirection du shell, et &1est le descripteur de fichier "sortie standard" (le &est nécessaire ici pour que le shell ne pense pas que je fais référence à un fichier nommé 1). 2 > &1Redirige donc toute sortie d'erreur standard vers l'entrée standard. Étant donné que le > my.logmoyen antérieur de rediriger la sortie standard vers my.log, nous avons besoin d'un moyen de garantir que les messages d'erreur sont également envoyés à my.log. 2 > &1garantit que ces erreurs vont à la sortie standard, qui à son tour va à my.log. Voir Réacheminement E / S .
lurker
6
echo $!me donne le pid de nohup au lieu du processus engendré: paste.fedoraproject.org/428697/99695314
Nehal J Wani
1
@Mvorisek &agit comme un séparateur de commande de sorte que vous pouvez essayer, sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". Cela pourrait fonctionner, mais je ne l'ai pas essayé.
lurker
91

J'utilise Red Hat Linux sur un serveur VPS (et via SSH - putty), pour moi, ce qui suit a fonctionné:

Tout d'abord, vous répertoriez tous les processus en cours d'exécution:

ps -ef

Ensuite, dans la première colonne, vous trouverez votre nom d'utilisateur; Je l'ai trouvé trois fois:

  • L'un était la connexion SSH
  • Le second était une connexion FTP
  • Le dernier était le processus nohup

Ensuite, dans la deuxième colonne, vous pouvez trouver le PID du processus nohup et vous tapez uniquement:

kill PID 

(en remplaçant le PID par le PID du processus nohup bien sûr)

Et c'est tout!

J'espère que cette réponse sera utile pour quelqu'un que je suis également très nouveau dans bash et SSH, mais j'ai trouvé 95% des connaissances dont j'ai besoin ici :)

Cabine téléphonique
la source
3
Je pense que vous vouliez dire PID au lieu d'UID ici?
wprins
Je suis d'accord avec @wprins. Tuer l'UID n'a pas fonctionné pour moi, mais tuer le PID l'a fait.
Ryan
Dans mon cas, j'ai exécuté un script de shell de test (long_running_script.sh) avec nohup et & et dint sais comment l'arrêter. Enfin, j'ai fait un ps -ef | grep long_running * et fouund le PID. Puis a fait un kill PID
Rennish Joseph
50

supposons que j'exécute un script ruby ​​en arrière-plan avec la commande ci-dessous

nohup ruby script.rb &

alors je peux obtenir le pid du processus d'arrière-plan ci-dessus en spécifiant le nom de la commande. Dans mon cas, la commande est rubis.

ps -ef | grep ruby

production

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

Maintenant, vous pouvez facilement tuer le processus en utilisant la commande kill

kill 25938
Sanjay Salunkhe
la source
1
Sanjay, juste pour être sûr de ne rien manquer, quelle partie de votre réponse est nouvelle ou différente des réponses fournies il y a des années? ps -efet killétaient tous deux bien couverts ci-dessus, alors quelle est la nouvelle partie?
David C. Rankin
2
ps -ef vous donnera la longue liste de sortie et la recherche à partir de cette longue liste sera difficile. donc je pense que ps -ef | grep ruby ​​est une meilleure commande pour rechercher pid que simplement faire ps -ef
Sanjay Salunkhe
20

jobs -l devrait vous donner le pid pour la liste des processus nohup. tuez-les (-9) doucement. ;)

Puneet S. Chauhan
la source
11
Uniquement si le travail a été démarré dans le shell actuel. Et ne le faites pas kill -9sauf si vous savez que les signaux réguliers ne fonctionnent pas.
tripleee
1
C'est utile, si vous êtes sur une image de docker où ps n'est pas installé :-)
Andreas Profous
5

Tu pourrais essayer

kill -9 `pgrep [command name]`
Balliver
la source
2
très agréable! J'ai utilisé que pkill [command name]vous pouvez utiliser l' -oindicateur pour tuer le processus de correspondance le plus ancien ou -nutiliser le plus récent à la place.
zanona
4

Cela fonctionne en Ubuntu

Tapez ceci pour découvrir le PID

ps aux | grep java

Tout le processus en cours concernant Java sera affiché

Dans mon cas, c'est

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

Maintenant tue-le kill -9 3315

Le processus zombie s'est finalement arrêté.

John Joe
la source
4

Supposons que vous exécutez un programme java avec nohup, vous pouvez obtenir l'identifiant du processus java en

`ps aux | grep java`

production

xxxxx     9643  0.0  0.0  14232   968 pts/2   

alors vous pouvez tuer le processus en tapant

sudo kill 9643

ou disons que vous devez tuer tous les processus java, puis utilisez simplement

sudo killall java

cette commande tue tous les processeurs java. vous pouvez l'utiliser avec le processus. donnez simplement le nom du processus à la fin de la commande

sudo killall {processName}
NuOne
la source
2

lorsque vous créez un travail dans nohup, il vous indiquera l'ID du processus!

nohup sh test.sh &

la sortie vous montrera l'ID du processus comme

25013

vous pouvez alors le tuer:

kill 25013
broid
la source
1

J'ai démarré le serveur django avec la commande suivante.

nohup manage.py runserver <localhost:port>

Cela fonctionne sur CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 
Naseer-shaik
la source
C'est la solution pour résoudre la process not foundconfusion avec nohup.
CodeSpent
0

Aujourd'hui, j'ai rencontré le même problème. Et comme c'était il y a longtemps, j'ai totalement oublié quelle commande j'ai utilisée et quand. J'ai essayé trois méthodes:

  1. Utilisation du STIME indiqué dans la ps -efcommande. Cela montre l'heure à laquelle vous démarrez votre processus, et il est très probable que vous ne commandiez rien juste avant de fermer ssh (cela dépend de vous). Malheureusement, je ne pense pas que la dernière commande soit la commande que j'exécute en utilisant nohup, donc cela ne fonctionne pas pour moi.
  2. Le deuxième est le PPID, également affiché dans la ps -efcommande. Cela signifie l'ID du processus parent, l'ID du processus qui crée le processus. Le ppid est 1 dans ubuntu pour le processus qui utilise nohup pour s'exécuter. Ensuite, vous pouvez utiliserps --ppid "1" pour obtenir la liste et vérifier TIME (le temps CPU total utilisé par votre processus) ou CMD pour trouver le PID du processus.
  3. Utilisez lsof -i:portsi le processus occupe certains ports et vous obtiendrez la commande. Ensuite, tout comme la réponse ci-dessus, utilisez ps -ef | grep commandet vous obtiendrez le PID.

Une fois que vous avez trouvé le PID du processus, vous pouvez l'utiliser kill pidpour terminer le processus.

Jeunes Wu
la source