3 aplicativos diferentes com o mesmo nome de arquivo em locais diferentes, como matar um pelo nome completo?

3 aplicativos diferentes com o mesmo nome de arquivo em locais diferentes, como matar um pelo nome completo?

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/exelinks 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, readlinkfalhará 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 $1for uma string vazia.

Observe também que este script faz uso de extglobwhich permite combinar diretórios com [1-9]*([0-9])which significa um caractere no intervalo 1-9seguido por qualquer número de caracteres no intervalo 0-9.

Responder2

Eu faço isso em uma linha com tubulação (você precisa gawkde 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.

informação relacionada