Script de bash que inicia um processo por 4 segundos, depois mata, não funciona

2

Eu tenho um script que inicia o firefox por 4 segundos e mata-o. O Firefox entrará automaticamente em um portal cativo, então eu só preciso que ele fique aberto por 4 segundos, assim que o wifi se conectar. Eu estou no Ubuntu 13.04.

Meu problema parece ser que $ pid não está definido.

firefox ; pid=$!
sleep 4
kill $pid

EDIT: conjunto removido, e agora dá kill pid inválido.

    
por Yet Another User 21.10.2013 / 18:16

5 respostas

6

Seu script não funciona, porque ele aguarda até que o processo do firefox termine e depois executa pid=$! e o outro comando.

Uma maneira fácil de fazer o que você quer é timeout :

timeout 4s firefox

Ele inicia o programa fornecido após o primeiro argumento e o interrompe após o tempo dado quando o primeiro argumento passou.

    
por 21.10.2013 / 21:16
1

A razão pela qual seu pid=$! falha é que $! é o PID do último trabalho executado em plano de fundo .

Ou seja,

$ foo & echo $!

iniciará foo e ecoará o PID do processo.

No seu caso, firefox ; pid=$! precisaria ser substituído por firefox & pid=$! , mas pode ser inútil, porque firefox é um script que exec s o binário real.

O que você precisa fazer é usar killall (que tentará matar todas as instâncias do firefox, seja seu ou de outros usuários) ou (copiar e) editar o script /usr/bin/firefox para ecoar o novo PID.

    
por 21.10.2013 / 20:08
0

Mais algumas soluções.

  • firefox & sleep 12; kill $! Muito genérico. Deve funcionar em qualquer lugar.
  • aptget install timeout e timeout -k 3m 14s firefox (Acabei de verificar um servidor Ubuntu e FreeBSD. Também não tinha instalado por padrão).
  • use expect conforme explicado aqui: link
  • perl -e "alarm 10; exec @ARGV" "firefox"
  • $COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID ( Fonte e explicação )
por 23.10.2013 / 18:02
-1

Depois de seguir algumas dicas das outras respostas, criei este script confuso:

firefox -no-remote -p c-portal &
ffpid='ps aux | grep firefox | sed '2q;d' | tr -s ' ' | cut -d ' ' -f 2'
echo "firefox pid: $ffpid"
sleep 4
kill $ffpid

Eu também precisava entrar em about: config e alterar browser.sessionstore.resume_from_crash para false.

Explicação de cada comando: ps aux obtém a lista completa de processos no sistema, o grep encontra todos os que contêm o firefox, o sed recebe a segunda linha (que parece ser sempre a mais recente do firefox), tr remove o extra espaços, corte obtém a segunda coluna (-d significa delimitador, que é um espaço).

Depois dessa confusão de processamento de string, há uma coisa de depuração que imprime o PID do firefox, dorme por 4 segundos, para que ele possa fazer o login e depois mata o firefox. A configuração about: config impede que ele tente restaurar a sessão.

    
por 21.10.2013 / 19:24
-2

Não tenho certeza se isso se ajusta à sua situação, mas você pode usar killall em vez de kill . Então seria:

firefox
sleep 4
killall firefox

Acho que uma abordagem mais correta é obter o último processo do firefox usando ps aux | grep firefox , mas hoje eu não sei como fazer esse tratamento de retornar apenas o número de processo mais alto usando o script bash.

    
por 21.10.2013 / 18:30