`Kill -p` funziona davvero?


11

Nella pagina man killè scritto come segue

SINOSSI

  kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
  kill -l [ signal ]

  -p     Specify  that kill should only print the process id (pid) of the
          named processes, and not send any signals.

Ma come ho provato molte volte sia in RH che in RHEL, il comando kill -s SIGHUP |-p 123non ha mai funzionato e viene sempre segnalato un errore

bash: -p: comando non trovato

Ho fatto degli errori?


11
Si noti che quando si digita il comando, vengono rimosse le [ ]parentesi e sostituite signalcon SIGHUPe pidcon 123? Perchè lo hai fatto? Perché sai che i simboli [, signale pidsono meta-sintattici, piuttosto che letterali. Indicano qual è la sintassi. Bene, il |simbolo è la stessa cosa: un altro indicatore meta-sintattico della sintassi. [a | b]significa: oggetto sintattico opzionale, che può essere uno ao b(ma non entrambi poiché deve essere un oggetto).
Kaz,

Grazie per le tue istruzioni. A proposito, come si pronuncia [a | b]?
user43312

Hmm. "Opzionale A o B".
Kaz,

Risposte:


51
kill [ -s signal | -p ]

Questa sintassi in una pagina di manuale significa:

Puoi usare kill -s signal o puoi usare kill -p, ma non puoi usare entrambi -se -pallo stesso tempo.

Il pipe ( |) sta per (esclusivo) o nella documentazione, non fa parte del comando.

Quando si digita

foo | bar

nella shell, tenterà di avviare fooe bar, e l'uscita del tubo fooal barprogramma. (Questa è la shell che lo fa, non foo(o bar), |non viene passato a nessuno dei due processi.) Nel tuo caso, la seconda parte è -p 123, quindi la shell cerca di trovare un eseguibile chiamato -pe fallisce con quel messaggio di errore.


Grazie, @Mat. Quindi do un comando simile kill -p 123. Dice bash: kill: p: invalid signal specification. E kill -p SIGINT 123dice la stessa cosa. Non credo che ci sia posto per mettere il segnale in base alla sintassi. Ti dispiace se fai solo una dimostrazione dell'uso -pdell'opzione?
user43312

2
@ user43312: vedi la risposta di slm per questo
Mat

32

Penso che vieni inciampato sul fatto che esiste un comando incorporato che Bash ha chiamato kill, insieme al comando kill.

$ type -a kill
kill is a shell builtin
kill is /usr/bin/kill
kill is /bin/kill

La pagina man che stai leggendo si riferisce al killcomando che si trova sotto /bin. Usa il percorso completo per evocarlo:

$ /bin/kill -p sleep
16486

Per inciso, /usr/bin/killè solo un link a /bin/kill.

$ ls -l /usr/bin/kill
lrwxrwxrwx 1 root root 14 Feb  9  2011 /usr/bin/kill -> ../../bin/kill

$ readlink -m /usr/bin/kill
/bin/kill

Funziona davvero. E apprezzo per tutte le demo.
user43312

@ user43312 - NP. Gli esempi sono sempre più facili da seguire rispetto alle pagine man Cool.
slm
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.