
Estou executando três aplicativos com o mesmo nome de arquivo em caminhos diferentes:
$ ~/app1/main
$ ~/app2/main
$ ~/app3/main
Quero criar um script bash que aceite o nome completo de um arquivo executável e elimine esse aplicativo.
$ ./my_killer.sh /home/me/app2/main
Como posso fazer isso, principalmente como posso encerrar um aplicativo pelo nome completo?
Responder1
Se você só precisa oferecer suporte ao Linux (o que eu acho que é o caso, já que sua pergunta está marcada como linux), você pode usar os /proc/%d/exe
links simbólicos.
Aqui está um exemplo de como seria um script para fazer isso.
#!/bin/bash
if [ "$#" != 1 ] || [ "$1" = "" ]
then
echo "Usage: $0 <full-exe-path>" 1>&2
exit 1
fi
shopt -s extglob
cd /proc
for PID in [1-9]*([0-9])
do
if [ "$(readlink "$PID"/exe)" = "$1" ]
then
kill "$PID"
fi
done
Uma advertência a ser observada é que se o ID do processo for um thread do kernel ou não for de sua propriedade, readlink
falhará e "$(readlink "$PID"/exe)"
será avaliado como uma string vazia. Para evitar a tentativa de eliminar todos esses processos, o script se recusará a fazer qualquer coisa se $1
for uma string vazia.
Observe também que este script faz uso de extglob
which permite combinar diretórios com [1-9]*([0-9])
which significa um caractere no intervalo 1-9
seguido por qualquer número de caracteres no intervalo 0-9
.
Responder2
Eu faço isso em uma linha com tubulação (você precisa gawk
de e xargs
):
$>ps -ax | grep "/app2/main" | grep -v "grep" | gawk '{print $1}' | xargs kill
o que esta acontecendo aqui?
ps -ax # — list all processes in extended format
grep "/app2/main" # — show only processes that contain "/app2/main"
grep -v "grep" # — sort out the previous grep process with the mentioned string
gawk '{print $1}' # — use gawk to pick only the first column (process id)
xargs kill # — use xargs to pass pid to kill as an argument
Isso envia efetivamente um sinal de interrupção para o processo que você precisa. Você pode envolvê-lo em um script bash, se quiser um comando curto com um argumento.