Olá, tenho um problema ao executar o comando watch como este:
watch cat /proc/$(ps ax | grep processname | grep -v grep | awk '{print $1}')/status
O comando funciona quando eu o inicio. No entanto, reinicio o processo que está sendo observado e o comando watch ainda usa o ID do processo antigo. Eu quero atualizar o ID do processo e mostrar o status de um novo processo com o mesmo nome. A parte $(ps ax | grep processname | grep -v grep | awk '{print $1}')
é obviamente executada apenas no início. Como posso fazer com que seja reavaliado toda vez que o relógio atualizar a saída?
Eu não gostaria de colocar o comando cat em um script bash e executar esse script no relógio.
Não é uma maneira legal, mas se você realmente se sentir relutante em criar um script. Você pode tentar
eval
.Salve o seguinte como, por exemplo,
ps-status.sh
em algum lugar do seu $PATH e torne-o executável comchmod +x
:Então execute
watch
assim:$pid
provavelmente deveria ser uma matriz, mas isso exigiria bash em vez de apenas sh:script.sh
explicação
agende o crontab para cada 1 minuto
Em seguida, use o comando watch abaixo para ver a diferença no ID do processo após reiniciar o nome do processo
Você pode apenas colocar aspas simples
$(...)
para evitar sua expansão pelo shell interativo a partir do qual está executando a coisa. E então você tem que escapar das aspas simples que você tem dentro disso, alternando temporariamente para aspas duplas e vice-versa. Então funciona o seguinte:No entanto, para entender o que
watch
está fazendo, aqui e em geral, você deve ter em mente quewatch
começa juntando todos os seus argumentos não sinalizadores em uma única string de comando. Ele faz isso para ser "útil", mas acho que é contraproducente, pois obscurece o que está acontecendo. Eu acho que é mais limpo e fácil de entender se você sempre der apenas uma única string de comando, neste caso entre aspas simples para evitar que seu shell interativo expanda qualquer coisa nele: