Ricerca…


Elenca i lavori correnti

$ tail -f /var/log/syslog > log.txt
[1]+  Stopped                 tail -f /var/log/syslog > log.txt

$ sleep 10 &

$ jobs
[1]+  Stopped                 tail -f /var/log/syslog > log.txt
[2]-  Running                 sleep 10 &

Gestione del lavoro

Creazione di posti di lavoro

Per creare un lavoro, aggiungi un singolo & dopo il comando:

$ sleep 10 &
[1] 20024

Puoi anche fare un processo in esecuzione un lavoro premendo Ctrl + z :

$ sleep 10
^Z
[1]+  Stopped                 sleep 10

Sfondo e primo piano un processo

Per portare il processo in primo piano, il comando fg viene utilizzato insieme a %

$ sleep 10 &
[1] 20024

$ fg %1
sleep 10

Ora puoi interagire con il processo. Per riportarlo sullo sfondo puoi usare il comando bg . A causa della sessione del terminale occupata, è necessario interrompere prima il processo premendo Ctrl + z .

$ sleep 10
^Z
[1]+  Stopped              sleep 10

$ bg %1
[1]+ sleep 10 &

A causa della pigrizia di alcuni programmatori, tutti questi comandi funzionano anche con una singola % se esiste un solo processo o per il primo processo nell'elenco. Per esempio:

$ sleep 10 &
[1] 20024

$ fg %        # to bring a process to foreground 'fg %' is also working.
sleep 10

o semplicemente

$ %           # laziness knows no boundaries, '%' is also working.
sleep 10

Inoltre, semplicemente digitando fg o bg senza alcun argomento si gestisce l'ultimo lavoro:

$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20

Uccisione di lavori in corso

$ sleep 10 &
[1] 20024

$ kill %1
[1]+  Terminated              sleep 10

Il processo di sospensione viene eseguito in background con ID processo (pid) 20024 e numero di lavoro 1 . Per fare riferimento al processo, è possibile utilizzare il pid o il numero del lavoro. Se si utilizza il numero del lavoro, è necessario prefisso con % . Il segnale di kill predefinito inviato da kill è SIGTERM , che consente al processo di destinazione di uscire con garbo.

Di seguito sono mostrati alcuni segnali di uccisione comuni. Per vedere un elenco completo, esegui kill -l .

Nome del segnale Valore del segnale Effetto
SIGHUP 1 Appendere
SIGINT 2 Interrompere dalla tastiera
SIGKILL 9 Uccidere il segnale
SIGTERM 15 Segnale di terminazione

Avvia e uccide processi specifici

Probabilmente il modo più semplice per uccidere un processo in esecuzione è selezionarlo attraverso il nome del processo come nell'esempio seguente usando il comando pkill come

pkill -f test.py

(o) un modo più a prova di pazzo usando pgrep per cercare l'id-processo vero e proprio

kill $(pgrep -f 'python test.py')

Lo stesso risultato può essere ottenuto usando grep su ps -ef | grep name_of_process quindi uccide il processo associato al pid risultante (id processo). Selezionare un processo usando il suo nome è conveniente in un ambiente di test, ma può essere molto pericoloso quando lo script viene utilizzato in produzione: è praticamente impossibile essere sicuri che il nome corrisponda al processo che si desidera effettivamente uccidere. In questi casi, il seguente approccio è molto più sicuro.

Inizia lo script che alla fine verrà ucciso con il seguente approccio. Supponiamo che il comando che vuoi eseguire ed eventualmente uccidere sia python test.py

#!/bin/bash

if [[ ! -e /tmp/test.py.pid ]]; then   # Check if the file already exists
    python test.py &                   #+and if so do not run another process.
    echo $! > /tmp/test.py.pid
else
    echo -n "ERROR: The process is already running with pid "
    cat /tmp/test.py.pid
    echo
fi

Questo creerà un file nella /tmp contenente il pid del processo python test.py Se il file esiste già, assumiamo che il comando sia già in esecuzione e lo script restituisca un errore.

Quindi, quando vuoi ucciderlo usa il seguente script:

#!/bin/bash

if [[ -e /tmp/test.py.pid ]]; then   # If the file do not exists, then the
    kill `cat /tmp/test.py.pid`      #+the process is not running. Useless
    rm /tmp/test.py.pid              #+trying to kill it.
else
    echo "test.py is not running"
fi

questo ucciderà esattamente il processo associato al tuo comando, senza fare affidamento su alcuna informazione volatile (come la stringa usata per eseguire il comando). Anche in questo caso se il file non esiste, lo script presuppone che si desideri terminare un processo non in esecuzione.

Questo ultimo esempio può essere facilmente migliorato per l'esecuzione dello stesso comando più volte (aggiungendo il file pid invece di sovrascriverlo, ad esempio) e per gestire i casi in cui il processo muore prima di essere ucciso.

Elenca tutti i processi

Esistono due metodi comuni per elencare tutti i processi su un sistema. Entrambi elencano tutti i processi in esecuzione da parte di tutti gli utenti, sebbene differiscano nel formato che emettono (il motivo per cui le differenze sono storiche).

ps -ef   # lists all processes 
ps aux   # lists all processes in alternative format (BSD)

Questo può essere usato per verificare se una determinata applicazione è in esecuzione. Ad esempio, per verificare se il server SSH (sshd) è in esecuzione:

ps -ef | grep sshd

Verifica quale processo è in esecuzione su una porta specifica

Per verificare quale processo è in esecuzione sulla porta 8080

lsof -i :8080

Ricerca di informazioni su un processo in esecuzione

ps aux | grep <search-term> mostra i processi che corrispondono al termine di ricerca

Esempio:

root@server7:~# ps aux | grep nginx
root       315  0.0  0.3 144392  1020 ?        Ss   May28   0:00 nginx: master process /usr/sbin/nginx
www-data  5647  0.0  1.1 145124  3048 ?        S    Jul18   2:53 nginx: worker process
www-data  5648  0.0  0.1 144392   376 ?        S    Jul18   0:00 nginx: cache manager process
root     13134  0.0  0.3   4960   920 pts/0    S+   14:33   0:00 grep --color=auto nginx
root@server7:~#

Qui, la seconda colonna è l'id del processo. Ad esempio, se si desidera annullare il processo nginx, è possibile utilizzare il comando kill 5647 . Si consiglia sempre di utilizzare il comando kill con SIGTERM anziché SIGKILL .

Scartare il lavoro in background

$ gzip extremelylargefile.txt &
$ bg
$ disown %1

Ciò consente di continuare un processo di lunga durata una volta che la shell (terminale, ssh, ecc.) È chiusa.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow