Come ottenere l'ID processo per terminare un processo nohup?


204

Sto eseguendo un processo nohup sul server. Quando provo a ucciderlo invece la mia console putty si chiude.

ecco come provo a trovare l'ID processo:

ps -ef |grep nohup 

questo è il comando per uccidere

 kill -9 1787 787

6
Stai cercando di ucciderlo da uno script o dalla riga di comando? È necessario salvare il PID quando lo si esegue nohupe utilizzarlo in seguito per il kill, oppure trovare il processo tramite il nome del comando ps -efnell'output e ottenere il PID da quello. Devi cercare il nome del comando, no nohup.
agguato il

1
@mbratch Dovresti dare una risposta invece di un commento.
Ansgar Wiechers,

@AnsgarWiechers grazie per il suggerimento. A volte se la mia risposta è molto breve, o se non sono sicuro che copra totalmente ciò che l'OP sta chiedendo, sono titubante nel postarla come risposta. Ho aggiunto una risposta e incluso ulteriori informazioni.
agguato il

Risposte:


353

Quando si utilizza nohupe si mette l'attività in background, l'operatore in background ( &) fornirà il PID al prompt dei comandi. Se il tuo piano è di gestire manualmente il processo, puoi salvare quel PID e usarlo in seguito per terminare il processo, se necessario, tramite kill PIDo kill -9 PID(se devi forzare l'uccisione). In alternativa, è possibile trovare il PID in un secondo momento ps -ef | grep "command name"e individuare il PID da lì. Si noti che la nohupparola chiave / il comando non vengono visualizzati psnell'output del comando in questione.

Se hai usato uno script, potresti fare qualcosa del tipo:

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

Ciò verrà eseguito my_commandsalvando tutto l'output in my.log(in uno script, $!rappresenta il PID dell'ultimo processo eseguito). Il 2è il descrittore di file per errore standard ( stderr) e 2>&1dice alla shell di percorso di uscita standard error allo standard output (descrittore di file 1). Richiede &1che la shell sappia che è un descrittore di file in quel contesto anziché solo un file chiamato 1. Il 2>&1che serve per catturare eventuali messaggi di errore che normalmente vengono scritti standard error nel nostro my.logfile (che viene da standard output). Vedere Reindirizzamento I / O per maggiori dettagli sulla gestione del reindirizzamento I / O con la shell.

Se il comando invia l'output su base regolare, è possibile controllare l'output occasionalmente con tail my.logo se si desidera seguirlo "live" che è possibile utilizzare tail -f my.log. Infine, se devi interrompere il processo, puoi farlo tramite:

kill -9 `cat save_pid.txt`
rm save_pid.txt

15
Un leggero chiarimento, non è di nohupper sé, che stampa il PID, è il finale &che lo fa da sfondo, ad esempio ls &mostrerebbe il PID per l'esecuzionels
karmakaze

1
Cosa fa "2> & 1"?
Viraj,

4
@Viraj 2è il descrittore di file "errore standard". >è il reindirizzamento della shell ed &1è il descrittore di file "output standard" ( &è necessario qui, quindi la shell non penserà che mi riferisco a un file chiamato 1). Quindi 2 > &1reindirizza qualsiasi output di errore standard all'input standard. Poiché i > my.logmezzi precedenti per reindirizzare l'output standard my.log, abbiamo bisogno di un modo per garantire che anche i messaggi di errore vadano a my.log. 2 > &1assicura che tali errori vadano all'output standard, che a sua volta va a my.log. Vedere I O reindirizzamento / .
agguato il

6
echo $!mi dà il pid di nohup invece del processo generato: paste.fedoraproject.org/428697/99695314
Nehal J Wani

1
@Mvorisek &agisce come un delimitatore di comando in modo che si potrebbe provare, sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". Potrebbe funzionare, ma non l'ho provato.
agguato il

91

Sto usando Red Hat Linux su un server VPS (e tramite SSH - putty), per me ha funzionato:

Innanzitutto, elenchi tutti i processi in esecuzione:

ps -ef

Quindi nella prima colonna trovi il tuo nome utente; L'ho trovato le seguenti tre volte:

  • Uno era la connessione SSH
  • Il secondo era una connessione FTP
  • L'ultimo è stato il processo nohup

Quindi nella seconda colonna puoi trovare il PID del processo nohup e digitare solo:

kill PID 

(ovviamente sostituendo il PID con il PID del processo nohup)

E questo è tutto!

Spero che questa risposta sia utile anche per qualcuno a cui sono molto nuovo bash e SSH, ma ho trovato qui il 95% delle conoscenze di cui ho bisogno :)


3
Penso che intendessi PID anziché UID qui?
wprins,

Sono d'accordo con @wprins. Uccidere l'UID non ha funzionato per me, ma ha ucciso il PID.
Ryan,

Nel mio caso ho eseguito uno script della shell di test (long_running_script.sh) con nohup e & e dint sanno come fermarlo. Alla fine, ho fatto un ps -ef | grep long_running * e trova il PID. Poi fece un PID
Rennish Joseph il

50

supponiamo che sto eseguendo uno script ruby ​​in background con il comando seguente

nohup ruby script.rb &

quindi posso ottenere il pid del processo in background sopra specificando il nome del comando. Nel mio caso il comando è rubino.

ps -ef | grep ruby

produzione

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

Ora puoi facilmente terminare il processo usando il comando kill

kill 25938

1
Sanjay, solo per essere sicuro che non mi manchi nulla, quale parte della tua risposta è nuova o diversa dalle risposte fornite anni fa? ps -efed killerano entrambi ben coperti sopra, quindi qual è la nuova parte?
David C. Rankin,

2
ps -ef ti darà la lunga lista di output e la ricerca da questa lunga lista sarà difficile. quindi penso ps -ef | grep ruby ​​è il comando migliore per cercare pid piuttosto che fare semplicemente ps -ef
Sanjay Salunkhe,

20

jobs -l dovrebbe darti il ​​pid per l'elenco dei processi nohup. uccidili (-9) delicatamente. ;)


11
Solo se il lavoro è stato avviato nella shell corrente. E se non kill -9sai che i segnali regolari non funzionano.
triplo

1
Questo è utile, se ti trovi su un'immagine docker in cui ps non è installato :-)
Andreas Profous

5

Potresti provare

kill -9 `pgrep [command name]`

2
molto bella! Ho usato pkill [command name]puoi usare la -obandiera per uccidere il processo di abbinamento più vecchio, o -nper usare quello più recente.
zanona,

4

Questo funziona in Ubuntu

Digita questo per scoprire il PID

ps aux | grep java

Verrà mostrato tutto il processo in esecuzione relativo a Java

Nel mio caso è

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

Adesso uccidilo kill -9 3315

Il processo di zombi si è finalmente fermato.


4

Supponiamo che tu stia eseguendo un programma java con nohup puoi ottenere l'id del processo java

`ps aux | grep java`

produzione

xxxxx     9643  0.0  0.0  14232   968 pts/2   

quindi puoi terminare il processo digitando

sudo kill 9643

o diciamo che devi uccidere tutti i processi java e poi semplicemente usare

sudo killall java

questo comando uccide tutti i processori Java. puoi usarlo con process. basta dare il nome del processo alla fine del comando

sudo killall {processName}

2

quando crei un lavoro in nohup ti dirà l'ID del processo!

nohup sh test.sh &

l'output mostrerà l'ID processo come

25013

puoi ucciderlo quindi:

kill 25013

1

Ho avviato il server Django con il seguente comando.

nohup manage.py runserver <localhost:port>

Questo funziona su CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

Questo è il modo per risolvere la process not foundconfusione con nohup.
CodeSpent

0

Oggi ho riscontrato lo stesso problema. E poiché è stato tanto tempo fa, ho completamente dimenticato quale comando ho usato e quando. Ho provato tre metodi:

  1. Utilizzando lo STIME mostrato nel ps -efcomando. Questo mostra l'ora in cui inizi il tuo processo ed è molto probabile che tu non ti comandi prima di chiudere ssh (dipende da te). Sfortunatamente non penso che l'ultimo comando sia il comando che eseguo usando nohup, quindi questo non funziona per me.
  2. Il secondo è il PPID, mostrato anche nel ps -efcomando. Significa ID processo principale, l'ID del processo che crea il processo. Il ppid è 1 in Ubuntu per il processo che utilizza nohup per l'esecuzione. Quindi è possibile utilizzare ps --ppid "1"per ottenere l'elenco e controllare TIME (il tempo totale della CPU utilizzato dal processo) o CMD per trovare il PID del processo.
  3. Utilizzare lsof -i:portse il processo occupa alcune porte e si otterrà il comando. Quindi, proprio come la risposta sopra, usa ps -ef | grep commande otterrai il PID.

Una volta trovato il PID del processo, è possibile utilizzare kill pidper terminare il processo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.