É possível fazer isso. Pode-se escrever um script wrapper, que irá iniciar um processo e capturar seu PID e monitorar esse PID. Por exemplo, eu escrevi um pequeno script abaixo, que, se chamado como monitor_process.sh firefox
, lançará o firefox e esperará até que ele saia.
#!/bin/bash
nohup $@ &> /dev/null &
PID=$!
while ps --no-headers -p $PID > /dev/null
do
echo $PID
: # no-op
sleep 0.25
done
notify-send "$@ exited"
Claro que pode haver várias instâncias do firefox, por isso queremos ter algo como monitor_process.sh firefox
e ele irá monitorar todas as janelas do Firefox, até que todas elas saiam.
#!/bin/bash
SELF=$$
while pgrep -f firefox | grep -v $SELF > /dev/null
do
: # no-op
sleep 0.25
done
notify-send "$@ exited"
A maneira que eu fiz acima foi pegando PIDs de todos os processos que contêm string "firefox", mas ignorando o PID do script (porque monitor_process.sh firefox
será incluído na lista, e nós don ' Não quero isso - o script não sairá se ele se monitora constantemente).
É claro que o script será encerrado depois que ele enviar uma notificação e precisar ser reiniciado se você reabrir uma janela depois dela sair, então provavelmente seria mais fácil adicionar nohup $@ &> /dev/null &
à segunda linha do script e usá-la como lançador e monitor.
Como alternativa, podemos adicionar um loop while externo que monitorará se o firefox está em execução e iniciará o monitoramento apenas se estiver em execução; se não - comece a monitorar.
#!/bin/bash
start_monitoring()
{
while pgrep -f "$@" | grep -v $SELF &> /dev/null
do
: # no-op
sleep 0.25
done
notify-send "$@ exited"
}
main()
{
local SELF=$$
while true
do
pgrep -f "$@" | grep -v $SELF > /dev/null
[ $? -eq 0 ] && start_monitoring "$@"
sleep 0.25
done
}
main "$@"
E o código acima funcionará para várias instâncias do firefox e vários fechamentos e reaberturas, para que você possa fechar o firefox durante a sessão, ele o notificará e continuará esperando até aparecer um novo, e começará a monitorar isso.