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:
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:
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 .
@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 :)
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.
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. ;)
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é :-)
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é
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:
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.
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.
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.
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
.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, viakill PID
oukill -9 PID
(si vous devez forcer la suppression). Alternativement, vous pouvez trouver le PID plus tard parps -ef | grep "command name"
et localiser le PID à partir de là. Notez que lenohup
mot - clé / commande lui-même n'apparaît pas dans laps
sortie de la commande en question.Si vous avez utilisé un script, vous pourriez faire quelque chose comme:
Cela exécutera l'
my_command
enregistrement de toutes les sortiesmy.log
(dans un script,$!
représente le PID du dernier processus exécuté). Le2
est le descripteur de fichier pour l' erreur - type (stderr
) et2>&1
indique la coque pour acheminer la sortie d'erreur standard à la sortie standard (descripteur de fichier1
). 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
. Le2>&1
est nécessaire pour capturer tous les messages d'erreur qui sont normalement écrits en erreur standard dans notremy.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'utilisertail -f my.log
. Enfin, si vous devez tuer le processus, vous pouvez le faire via:la source
nohup
soi, qui imprime le PID, c'est la finale&
qui le met en arrière-plan, par exemplels &
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 versmy.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:
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:
(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 :)
la source
supposons que j'exécute un script ruby en arrière-plan avec la commande ci-dessous
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.
production
Maintenant, vous pouvez facilement tuer le processus en utilisant la commande kill
la source
ps -ef
etkill
é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. ;)
la source
kill -9
sauf si vous savez que les signaux réguliers ne fonctionnent pas.Tu pourrais essayer
la source
pkill [command name]
vous pouvez utiliser l'-o
indicateur pour tuer le processus de correspondance le plus ancien ou-n
utiliser le plus récent à la place.Cela fonctionne en
Ubuntu
Tapez ceci pour découvrir le
PID
Tout le processus en cours concernant Java sera affiché
Dans mon cas, c'est
Maintenant tue-le
kill -9 3315
Le processus zombie s'est finalement arrêté.
la source
Supposons que vous exécutez un programme java avec nohup, vous pouvez obtenir l'identifiant du processus java en
production
alors vous pouvez tuer le processus en tapant
ou disons que vous devez tuer tous les processus java, puis utilisez simplement
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
la source
lorsque vous créez un travail dans nohup, il vous indiquera l'ID du processus!
la sortie vous montrera l'ID du processus comme
vous pouvez alors le tuer:
la source
J'ai démarré le serveur django avec la commande suivante.
Cela fonctionne sur CentOS:
la source
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, utilisezps -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.la source