Verifique a existência de um PID do mesmo script.
Supondo que seu script seja chamado my_script.sh , adicione isso no início do script:
#!/bin/bash
for pid in $(pidof -x my_script.sh); do
if [ $pid != $$ ]; then
kill -9 $pid
fi
done
Eu quero matar o processo em segundo plano pertencente a um script de shell que eu vou executar novamente.
Isso significa que, antes de executar o script de shell, eu quero excluir o processo em segundo plano em execução para o script same .
Verifique a existência de um PID do mesmo script.
Supondo que seu script seja chamado my_script.sh , adicione isso no início do script:
#!/bin/bash
for pid in $(pidof -x my_script.sh); do
if [ $pid != $$ ]; then
kill -9 $pid
fi
done
Eu fiz isso há muito tempo em um dos meus scripts de shell. Aqui está como eu fiz:
ps aux | \
grep -P ${BASH_SOURCE[0]} | \
grep -v $$ | \
grep -P "bash" | \
grep -oP "^[[:alnum:]]+\s+\d+\s" | \
grep -oP "\d+" | \
xargs kill -9
A beleza desse método é que ele NÃO matará o script em execução atual, apenas as instâncias anteriores dele.
Um exemplo de script para demonstrar o método acima é este:
#!/bin/bash
ps aux | grep -P ${BASH_SOURCE[0]} | grep -v $$ | grep -P "bash" | grep -oP "^[[:alnum:]]+\s+\d+\s" | grep -oP "\d+"
sleep 100
Agora, execute uma instância desse script no seu terminal. Em seguida, execute outra instância em um terminal diferente. Você verá que a instância anterior será imediatamente eliminada enquanto a segunda é executada corretamente.
Tente isto:
#!/bin/sh
if [ -f /var/run/sh.pid ]; then
echo "Process already running."
kill -9 'cat /var/run/sh.pid'
rm -f /var/run/sh.pid
fi
echo 'pidof $$' > /var/run/sh.pid
# From here, your normal shell script can resume
este é mais curto e funcionou para mim no meu app ruby
ps -ef| grep search_pattern | awk '{print $2}' | xargs kill -9
substitua search_pattern pelo nome do seu script