Como saber se um programa específico está aberto

1

Usando uma linha de comando no terminal, quero exibir 1 se um programa (por exemplo, Firefox ou Chromium) estiver aberto e 0 caso contrário.

Editar: por "abrir", quero dizer "está sendo executado na máquina atual e tem uma janela aberta no servidor X que estou vendo"

    
por Radu Rădeanu 05.06.2013 / 13:13

3 respostas

2
xwininfo -root -children | grep -q '"Firefox")'
echo "$(($? == 0))"

A saída seria 1 se houvesse uma janela da classe Firefox conectada ao seu servidor X (por qualquer usuário de qualquer máquina).

Para limitar os processos do Firefox locais à máquina em que você está executando esse comando:

xwininfo -root -children |
  awk '/"Firefox"\)/{print $1}' |
  xargs -I% xprop -id % WM_CLIENT_MACHINE |
  cut -d\" -f2 |
  grep -qFx "$(uname -n)"

A pesquisa pelo nome do processo não oferece garantia de que os processos estão realmente exibindo suas janelas no seu servidor X.

O método descrito acima é consistente com a forma como o firefox verifica um firefox atualmente em execução quando não passa a opção --no-remote .

    
por 05.06.2013 / 13:39
2

pgrep -x chromium não corresponderia a nomes de processos como chromium-foo e > /dev/null poderia ser substituído por -q :

pgrep -xq chromium; echo $(($? == 0))

pgrep não é definido pelo POSIX e, por exemplo, não foi incluído no OS X até recentemente. Mas você também pode usar ps :

ps -eo comm= | grep -xq chromium; echo $(($? == 0)) # GNU
ps -eco comm= | grep -xq chromium; echo $(($? == 0)) # OS X
ps -eo comm= | sed 's|.*/||' | grep -xq chromium; echo $(($? == 0)) # either

No OS X -o comm imprime os caminhos absolutos dos comandos e -co comm imprime os nomes básicos. No% GNU-o comm imprime os nomes básicos e -c não está definido.

    
por 05.06.2013 / 13:50
1

Existem algumas maneiras de verificar se um processo com um nome específico está sendo executado no momento. Uma é usar pgrep e outra é usar ps :

pgrep "chromium" >/dev/null 2>&1 && echo 1 || echo 0
ps aux | grep "[c]hromium" >/dev/null 2>&1 && echo 1 || echo 0
grep "[c]hromium" <(ps aux) >/dev/null 2>&1 && echo 1 || echo 0

O comando pgrep procura processos baseados em seus nomes e exibe o PID de qualquer processo que corresponda ao seu argumento. Aqui, o valor de retorno de pgrep é usado em vez de sua saída (portanto, o redirecionamento para /dev/null ), portanto, sabemos se algo corresponde ou não. O comando grep também exibirá correspondências para stdout , portanto, também precisa ser redirecionado.

    
por 05.06.2013 / 13:18