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
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
Risposte:
Quando si utilizza nohup
e 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 PID
o 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 nohup
parola chiave / il comando non vengono visualizzati ps
nell'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_command
salvando 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>&1
dice alla shell di percorso di uscita standard error allo standard output (descrittore di file 1
). Richiede &1
che la shell sappia che è un descrittore di file in quel contesto anziché solo un file chiamato 1
. Il 2>&1
che serve per catturare eventuali messaggi di errore che normalmente vengono scritti standard error nel nostro my.log
file (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.log
o 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
nohup
per sé, che stampa il PID, è il finale &
che lo fa da sfondo, ad esempio ls &
mostrerebbe il PID per l'esecuzionels
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 > &1
reindirizza qualsiasi output di errore standard all'input standard. Poiché i > my.log
mezzi 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 > &1
assicura che tali errori vadano all'output standard, che a sua volta va a my.log
. Vedere I O reindirizzamento / .
echo $!
mi dà il pid di nohup invece del processo generato: paste.fedoraproject.org/428697/99695314
&
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.
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:
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 :)
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
ps -ef
ed kill
erano entrambi ben coperti sopra, quindi qual è la nuova parte?
jobs -l dovrebbe darti il pid per l'elenco dei processi nohup. uccidili (-9) delicatamente. ;)
kill -9
sai che i segnali regolari non funzionano.
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.
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}
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
process not found
confusione con nohup.
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:
ps -ef
comando. 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.ps -ef
comando. 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.lsof -i:port
se il processo occupa alcune porte e si otterrà il comando. Quindi, proprio come la risposta sopra, usa ps -ef | grep command
e otterrai il PID.Una volta trovato il PID del processo, è possibile utilizzare kill pid
per terminare il processo.
nohup
e utilizzarlo in seguito per ilkill
, oppure trovare il processo tramite il nome del comandops -ef
nell'output e ottenere il PID da quello. Devi cercare il nome del comando, nonohup
.