Como matar um comando executado a partir de um script?

0

Eu gostaria de iniciar um tcpdump em meu próprio script e depois de algum tempo eu gostaria de matá-lo novamente. Como posso acessar o PID do tcpdump? Eu tentei com $$, mas isso só mata o script.

if [[ $TIMEEND != $Zeit ]];then
                        echo "tcpdump started"
                        sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
                        pid1=$!
                        break
                        #sudo umount /dev/sdb1
                else
                        sudo kill $pid1
                        echo "autodump stopped"
                fi

Esta é a saída quando eu tppump grep então eu acho que não é possível usar pidof e pkill.

Eutenteifazerissocomoawk

pid1=$(ps-eopid,args|awk'/abfrage2/&&!/awk/{print$1}')echo$pid1>>/tmp/test.txtsudokill$pid1

Quandoeuusodiretamenteocomandopid,eleencontraopidmasnãoexecutaokill.

Achoquetenhoquepensardemaisnomeucódigo.Euinformootempoapartirdoarquivodeconfiguração,entãoeuverificoseahoradeinícioéamesmae,sefor,tambémdeveverificarsenãoéotempodetérmino.Então,eledeveexecutarotcpdump,desdequenãosejaofinal.Quandochegaofim,devematarotcpdump.Euseiquenãoéamelhorsolução,masseriabomtrabalharcomalgoassim.

#!/bin/shsource/media/usbhd-sdb1/config.confpluggedin=trueecho$TIMESTARTecho$TIMEENDecho$$echo$Zeitecho$$>>/tmp/test.txtwhile[$pluggedin];doZeit=$(date+"%T")
        if [[ $TIMESTART == $Zeit ]];then
                if [[ $TIMEEND != $Zeit ]];then
                        echo "tcpdump started"
                        sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
                        #sudo umount /dev/sdb1
                else
                        pid1=$(ps -eo pid,args|awk '/abfrage2/ && ! /awk/{print $1}')
                        echo $pid1 >> /tmp/test.txt
                        sudo kill -9 $pid1
                        echo "autodump stopped"
                fi

        else
        echo "tcpdump not yet started"
        fi
done
    
por apuboard 30.11.2015 / 13:21

3 respostas

1

Seu comando sudo tcpdump deve entrar em segundo plano adicionando um e comercial & à linha:

sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &

A linha pid1=$! colocará o PID do comando sudo tcpdump na variável pid1

Se você quiser matar o processo, use:

sudo kill $pid1

Você usou $$ , que representa o PID do processo em execução atual.

Como você está usando isso dentro de outro script, que você provavelmente chamará várias vezes, todas as execuções subsequenciais não terão uma variável pid1 utilizada.

Para obter o PID nessa variável, você pode usar:

pid1=$(pidof tcpdump)

na seção else do seu script.

Ou simplesmente use:

sudo pkill tcpdump

Supondo que você tenha apenas uma cópia do tcpdump em execução.

Uma outra coisa que você precisa tomar cuidado. Toda vez que você chamar seu script e o $TIMEEND não for igual a $Zeit , ele iniciará outro processo tcpdump . Uma solução melhor seria:

if [ "$TIMEEND" != "$Zeit" ] && [ "$(pidof tcpdump)" == "" ]

que testará o requisito de tempo e a existência de um processo tcpdump .

    
por 30.11.2015 / 13:42
1

Se eu entendi que você quer rodar o tcpdump por algum tempo e matá-lo. Você pode fazer o seguinte:

#!/bin/bash
sudo tcpdump -i eth0 -w /media/usbhd-sd[b-c]1/abfrage2.pcap &
PID=$!
sleep 20
sudo kill -9 $PID
exit 0

O $! lhe dará o pid do comando iniciado. Para matá-lo, você invoca o kill [Signal] [PID] para matar o comando tcpdump.

Tenha em atenção que o tcpdump é executado em fundo com o & no final do comando else o tcpdump continuará executando no primeiro plano . O exit 0 garantirá que o script seja eliminado no final.

[Prova de conceito]

bash -x a.sh
+ PID=21988
+ sleep 10
+ tcpdump -i eth0 -w abfrage2.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
+ kill -9 21988
+ exit 0

[Alternativamente]

Como sugerido por Eric, você também pode fazer isso com timeout comando

#!/bin/bash
timeout 10s tcpdump -i eth0 -w abfrage2.pcap
exit 0
    
por 30.11.2015 / 13:42
0

Valores variáveis não são mantidos entre diferentes invocações do mesmo script. Ou seja, você não pode salvar seu PID de programa em uma variável e esperar que a variável seja inicializada para esse valor quando executar o script novamente.

Salve o valor do PID em um arquivo temporário:

if [...] ; then
    sudo tcpdump -i eth0 ..... &
    disown
    echo $! > somefile.pid
    echo "started"
else
    cat somefile.pid | xargs -n 1 kill
    echo "stopped"
fi

observe que este comando salva o sudo PID, não o tcpdump pid, o que significa que você não precisa de sudo novamente para eliminá-lo

Além disso, se você quiser que um comando em segundo plano dure mais do que o shell que está executando o script, você deve disown logo após o lançamento

    
por 30.11.2015 / 14:13