mata o processo xterm em uma festança

1

Eu gostaria de matar o processo xterm que iniciei deste modo em um script:

#!/bin/bash

echo "#!/bin/bash" > /tmp/test0
grep file | awk '{print "xterm -hold -e echo",$1,"sleep 10" && pid=$!}' >> /tmp/test0
echo "exit" >> /tmp/test0
chmod 700 /tmp/test0
bash /tmp/test0&
sleep 5
kill $pid  ---> does not work
exit

agora vamos dizer, eu tenho vários xterm lançados desta forma no mesmo bash (test0), existe uma maneira de armazenar seu pid correspondente em um array e chamá-los de volta quando é hora de matá-los? Além disso, ao armazenar esses valores, existe uma maneira de associá-los a outro valor (neste exemplo, com $ 1) para facilitar a chamada de retorno. nb: $ 1 = texto

muito obrigado!

    
por blue_xylo 15.08.2014 / 16:45

2 respostas

2

Quando você executa o script com:

bash /tmp/test0&

você está iniciando um processo bash totalmente separado e colocando-o em segundo plano. Você não pode ver as variáveis definidas nesse script; eles pertencem ao outro processo. Se você deseja obter acesso a variáveis definidas em outro arquivo, carregue esse arquivo em seu processo bash atual usando o . ou source :

. /tmp/test0

Depois disso, você poderá dizer $pid em seu script principal e obter o valor que foi definido no outro arquivo.

Tudo isso dito - a maneira como você está estruturando as coisas é muito intrigante. O script que você postou tem muitos outros erros que eu suponho serem de editar o verdadeiro para baixo para a pergunta (você usa $! como se fosse uma variável awk , mas então espera que a variável que você copiou para ser definido no script Bash, por exemplo, e test0 teria muitos erros de sintaxe). $! é definido apenas no Bash depois que um processo em segundo plano é executado com & : mesmo que o comando awk funcionasse, $pid estaria vazio. Se você deseja obter o PID do processo xterm dessa maneira, é necessário executá-lo como xterm ... & . bash /tmp/test0 & coloca o script test0 em segundo plano, em vez do comando xterm .

Parece que seria melhor livrar-se de test0 e apenas lançar xterm do script principal. Provavelmente vale a pena repensar sobre como você está lidando com as coisas em um nível mais alto . No mínimo, veja o que está no seu arquivo test0 real e veja se é o que você realmente quer.

    
por 16.08.2014 / 00:21
0

(Seu script bash não roda, há erros).

Então, por que o pid não é morto? É o pid errado? Ou talvez você precise forçá-lo a matar usando kill -9 ?

Em seguida, use pgrep para obter os pids. Crie um novo xterm e armazene o pid em xtermPid_1:

$ xtermPid_1=$(pgrep --newest xterm)

(veja as páginas man do pgrep, é uma boa ferramenta)

    
por 15.08.2014 / 17:22