Apagar, reiniciar o tancar la sessió a LinuxComandes LinuxLinux

La comanda skill a Linux: enviar senyals a processos (i per què ara es fa amb pkill)



La comanda skill envia un senyal a tots els processos que compleixen un criteri: els d’un usuari, els d’un terminal, els que tenen un nom concret… La seva germana snice fa el mateix però canviant-ne la prioritat. Totes dues formen part del paquet procps (el mateix de ps, top o kill).

Avui skill i snice estan obsoletes. La seva pròpia pàgina del manual ho diu: «aquestes eines són obsoletes i poc portables, i la sintaxi està mal definida; fes servir killall, pkill i pgrep». Encara venen instal·lades a Debian i Ubuntu, però per a scripts i per a l’ús diari les alternatives actuals són pkill (enviar senyals) i renice (canviar prioritats). En aquest post t’explico totes dues coses.

Sintaxi

skill [senyal] [opcions] criteri
snice [prioritat] [opcions] criteri

El senyal per defecte de skill és TERM. El criteri pot ser un usuari, un terminal, un PID o un nom de comanda; per evitar ambigüitats, indica’l amb aquestes opcions:

OpcióEl criteri és…
-u usuariUn usuari
-t terminalUn terminal (pts/0, tty1…)
-p pidUn número de procés
-c comandaUn nom de comanda

Opcions més útils

OpcióQuè fa
-n, --no-actionSimulació: diu què faria sense fer-ho
-i, --interactiveDemana confirmació per a cada procés
-v, --verboseExplica què fa
-l / -LLlista els noms dels senyals (-L, en forma de taula)

Senyals més habituals

SenyalNúmeroQuè fa
TERM15Demana al procés que acabi (pot desar i tancar ordenadament). És el valor per defecte
KILL9El mata immediatament, sense que pugui fer res. Només si TERM no funciona
HUP1Molts serveis el fan servir per tornar a llegir la configuració
STOP19Congela el procés (no es pot ignorar)
CONT18Reprèn un procés congelat

Els números són els de Linux en x86 i ARM; als scripts, millor fer servir el nom.

Exemples amb skill

Abans de res, fes una simulació amb -n per veure què afectaria:

$ skill -n -c dormilega
?        oscar    2016611 dormilega          Success
?        oscar    2016613 dormilega          Success

Congelar i reprendre tots els processos amb aquest nom:

skill -STOP -c dormilega
skill -CONT -c dormilega

Acabar tots els processos de l’usuari joan (cal ser root per tocar processos d’altres usuaris):

sudo skill -TERM -u joan

Rebaixar la prioritat d’una comanda amb snice (per defecte, +4):

snice +7 -c compilador

L’alternativa actual: pgrep, pkill i renice

Amb skill / sniceAmb les eines actuals
skill -n -c nompgrep -l nom
skill -TERM -c nompkill nom
skill -KILL -u joanpkill -KILL -u joan
skill -STOP -t pts/2pkill -STOP -t pts/2
snice +5 -c nomrenice -n 5 -p $(pgrep -d' ' nom)

Exemples reals:

# Primer, comprova què coincideix (pgrep no envia res)
$ pgrep -a dormilega
2016611 ./dormilega 300
2016613 ./dormilega 301

# Baixar-ne la prioritat
$ renice -n 5 -p $(pgrep -d' ' dormilega)
2016611 (process ID) old priority 0, new priority 5
2016613 (process ID) old priority 0, new priority 5

# Acabar-los, mostrant què fa (-e)
$ pkill -e dormilega
dormilega killed (pid 2016611)
dormilega killed (pid 2016613)

Un consell amb pkill: el nom és un patró, i pkill ssh també mataria sshd o ssh-agent. Fes servir -x perquè coincideixi exactament amb el nom, i prova sempre abans amb pgrep amb les mateixes opcions.

Compte amb…

  • Matar tots els processos d’un usuari (skill -KILL -u joan o pkill -KILL -u joan) li tanca la sessió de cop i pot fer perdre feina. Si el que vols és tancar-li la sessió, loginctl terminate-user joan és més net.
  • No comencis per KILL: dona primer a TERM l’oportunitat de tancar bé el procés.
  • Prioritats negatives (més prioritat) amb snice o renice només les pot posar root.

Correccions respecte a la versió antiga d’aquest post

  • El nom no ve de «signal processes of a given user id»: skill pot seleccionar processos per usuari, terminal, PID o nom de comanda.
  • No cal «estar al mateix grup de processos»: pots enviar senyals als teus propis processos; per als d’altres usuaris cal ser root.

Comandes relacionades