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
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
Réponses:
Lorsque vous utilisez nohup
et 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 PID
ou 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 nohup
mot - clé / commande lui-même n'apparaît pas dans la ps
sortie 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_command
enregistrement de toutes les sorties my.log
(dans un script, $!
représente le PID du dernier processus exécuté). Le 2
est le descripteur de fichier pour l' erreur - type ( stderr
) et 2>&1
indique la coque pour acheminer la sortie d'erreur standard à la sortie standard (descripteur de fichier 1
). Cela nécessite &1
que 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>&1
est nécessaire pour capturer tous les messages d'erreur qui sont normalement écrits en erreur standard dans notre my.log
fichier (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
nohup
soi, qui imprime le PID, c'est la finale &
qui le met en arrière-plan, par exemple ls &
montrerait le PID pour la coursels
2
est le descripteur de fichier "erreur standard". >
est la redirection du shell, et &1
est 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 > &1
Redirige donc toute sortie d'erreur standard vers l'entrée standard. Étant donné que le > my.log
moyen 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 > &1
garantit que ces erreurs vont à la sortie standard, qui à son tour va à my.log
. Voir Réacheminement E / S .
echo $!
me donne le pid de nohup au lieu du processus engendré: paste.fedoraproject.org/428697/99695314
&
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é.
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:
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 :)
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
ps -ef
et kill
étaient tous deux bien couverts ci-dessus, alors quelle est la nouvelle partie?
jobs -l devrait vous donner le pid pour la liste des processus nohup. tuez-les (-9) doucement. ;)
kill -9
sauf si vous savez que les signaux réguliers ne fonctionnent pas.
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é.
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}
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
process not found
confusion avec nohup.
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:
ps -ef
commande. 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.ps -ef
commande. 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.lsof -i:port
si le processus occupe certains ports et vous obtiendrez la commande. Ensuite, tout comme la réponse ci-dessus, utilisez ps -ef | grep command
et vous obtiendrez le PID.Une fois que vous avez trouvé le PID du processus, vous pouvez l'utiliser kill pid
pour terminer le processus.
nohup
et l'utiliser plus tard pour lekill
, soit rechercher le processus par son nom de commande dans laps -ef
sortie et obtenir le PID à partir de cela. Vous devez chercher le nom de la commande, nonnohup
.