Comando pkill in Linux: inviare segnali ai processi per nome

pkill invia un segnale ai processi che corrispondono a un nome o ad altri criteri. Il segnale predefinito è SIGTERM, una richiesta di terminazione; un modello troppo ampio può coinvolgere più processi del previsto.

Usa criteri della stessa famiglia di pgrep, ma compie un’azione anziché limitarsi a elencare i PID. Prima esamina i bersagli con pgrep -a e gli stessi filtri. Questo controllo riduce gli errori, ma non blocca la creazione o la terminazione di processi fra i due comandi.

Sintassi di base

pkill [opzioni] modello

La guida riguarda procps-ng su Linux. Verifica le opzioni con man pkill nella tua installazione. Il modello è un’espressione regolare estesa, normalmente confrontata con il nome del processo.

Esempi pratici

Controllare prima il bersaglio

Gli esempi presuppongono un tuo processo di prova realmente chiamato myworker. Il comando seguente deve mostrarne PID e riga di comando: verifica che ogni riga appartenga all’attività da terminare. Il nome è un segnaposto, non una richiesta di cercare qualsiasi processo di lavoro.

pgrep -a -x myworker

Inviare la richiesta predefinita

Solo dopo il controllo, invia SIGTERM ai processi il cui nome completo corrisponde. Se più processi hanno quel nome, possono essere selezionati tutti.

pkill -x myworker

Limitare anche l’utente

Sostituisci alice con l’utente effettivo del tuo processo di prova. Prima verifica gli stessi criteri con pgrep -a -u alice -x myworker; usare un filtro per utente soltanto nella fase di controllo e ometterlo nell’azione allargherebbe il bersaglio.

pkill -u alice -x myworker

-u filtra per identificatore utente effettivo (EUID), non significa “qualunque utente valido” e non concede permessi aggiuntivi.

Verificare il risultato della richiesta

Per questa sequenza occorre un tuo processo di prova il cui nome sia davvero demo-worker. I comandi non lo creano: verifica prima che sia un’attività che puoi terminare e che tutte le righe restituite siano attese. La prima riga consulta, la seconda invia il segnale e la terza controlla nuovamente.

pgrep -a -x demo-worker
pkill -TERM -x demo-worker
pgrep -a -x demo-worker

La prima ricerca può mostrare il processo di prova. Senza opzioni di riepilogo, l’invio riuscito normalmente non stampa un elenco. Se la terminazione si è completata, l’ultima ricerca non mostra più corrispondenze; in caso contrario ricontrolla dopo il tempo previsto per l’arresto dell’applicazione.

Il blocco è una sequenza illustrativa, non un controllo automatico degli errori: la shell può eseguire l’ultima riga anche se pkill fallisce. Per leggere lo stato dell’invio, consulta $? immediatamente dopo pkill, prima di eseguire un altro comando. In procps-ng, 0 indica almeno un processo corrispondente a cui il segnale è stato inviato con successo, 1 nessuna corrispondenza o nessun invio riuscito, 2 errore di sintassi e 3 errore fatale. Lo stato 0 non garantisce che tutti i bersagli siano terminati.

-x richiede la corrispondenza dell’intero nome, ma il modello resta una regex. -f confronta invece la riga di comando completa; con -x -f deve corrispondere tutta la riga. Applica gli esempi soltanto a processi di prova sotto il tuo controllo; per servizi reali segui la procedura operativa prevista.

Nell’ambiente Windows con Git Bash disponibile per questa verifica, pkill non è installato. I quattro esempi sono stati controllati per la sintassi Bash; non sono stati inviati segnali né riprodotte terminazioni su Linux.

Opzioni principali

Opzione Significato in procps-ng
-x Richiede la corrispondenza dell’intero nome.
-u utente Limita i bersagli per EUID, accettando nome o numero.
-f Usa la riga di comando completa per il confronto.
-TERM Specifica esplicitamente SIGTERM.
-e Mostra nome e PID dei processi a cui viene inviato il segnale; non è una simulazione.

Il nome usato per la ricerca ha un limite documentato di 15 caratteri in procps-ng. Un programma avviato da un interprete può avere un nome diverso da quello dello script: controlla la riga di comando senza supporre che il nome del file sia il nome del processo.

Precauzioni nell’invio dei segnali

pkill -f può includere molte attività quando una porzione della riga di comando corrisponde. Non allargare il modello per tentativi dopo un risultato vuoto. I permessi di invio sono distinti dalla possibilità di vedere un processo; la selezione per EUID non autorizza da sola l’operazione.

SIGTERM può essere gestito, ignorato o bloccato dal processo, perciò l’invio non impone un arresto immediato. SIGKILL non può essere intercettato, ignorato o bloccato e impedisce la pulizia gestita dall’applicazione; non usarlo come prima scelta ordinaria. Il manuale signal(7) spiega queste differenze.

Per un servizio gestito preferisci la sua procedura di arresto: terminare il processo può indurre il gestore a riavviarlo. Prima e dopo un intervento controlla PID, utente e comando. I PID possono essere riutilizzati e il controllo precedente non congela il bersaglio. Le regole Linux sui permessi di invio dei segnali sono documentate separatamente dai filtri di ricerca.

Domande frequenti

Qual è la differenza tra pkill e pgrep?

pgrep cerca i PID che soddisfano i criteri; pkill invia davvero un segnale ai processi corrispondenti. Aggiungere -e a pkill mostra informazioni sull’azione, ma non la rende una prova senza effetti.

Documentazione di riferimento

Consulta il manuale condiviso di pgrep, pkill e pidwait per opzioni, criteri e codici di uscita, confrontandolo con man pkill della tua installazione.