Por que o kill não funciona no script, mas funciona no terminal?

4

Eu tenho o seguinte roteiro inventado para ilustrar meu problema:

#!/bin/bash
set -eux
sudo sleep 120 &
spid=$!
sleep 1
sudo kill $spid
wait $!

Isso imprimirá

$ ./test.sh 
+ spid=21931
+ sleep 1
+ sudo sleep 120
+ sudo kill 21931
+ wait 21931

e, em seguida, aguenta wait até que sleep 120 expire. No entanto, quando executo sudo kill 21931 de outro terminal, o processo de suspensão é interrompido imediatamente. Eu esperava que a linha sudo kill $spid no script também matasse o processo de suspensão imediatamente. Por que isso não funciona e como faço isso funcionar?

(Pode ser relevante: vejo este comportamento bash 4.3.42 e dash 0.5.7 no Ubuntu 15.10.)

    
por Steffan Karger 11.11.2015 / 23:20

2 respostas

0

Eu confirmo que esse comportamento estranho ocorre também no Ubuntu 17.10 bash 4.4.12 (1) -release (x86_64-pc-linux-gnu).

Não consegui descobrir o motivo real, mas parece que tem algo a ver com sinais de processo. Por padrão, kill envia o sinal 15 – TERM , que significa um soft kill. No entanto, se eu usar um disco rígido 9 – KILL , o processo de suspensão será imediatamente eliminado.

#!/bin/bash
set -eux
sudo sleep 120 &
spid=$!
sleep 1
sudo kill -9 $spid
wait $!

imprime

$ ./test.sh 
+ spid=4342
+ sleep 1
+ sudo sleep 120
+ sudo kill -9 4342
./test.sh: line 6:  4342 Killed                  sudo sleep 120
+ wait 4342
    
por 10.01.2018 / 11:40
-1

A diferença pode estar no arquivo / etc / sudoers. Talvez seu usuário tenha permissão para executar kill com nopasswd em uma máquina, mas não na outra.

    
por 12.11.2015 / 00:06