Encontrou a resposta de Alexander Batischev para usar sudo su -c
.
Solução (OLD):
sudo su -c 'timeout 200 grep -q "Started .*Application" <(tail -n1 -f /path/to/nameOfLog.log &)'
ATUALIZAÇÃO:
Com base na resposta da ilkkachu , fiz mais alguns testes e encontrei uma nova solução.
-
Primeiro, em resposta à resposta do ilkkachu sobre
sudo su
ser redundante. Se eu removersudo
do comando, serei solicitado a inserir uma senha. -
Segundo, em resposta à resposta do ilkkachu sobre um subshell não ser útil. Isso é verdade. No entanto, o comando sem o subshell só retorna se o log estiver sendo gravado ativamente por algum motivo. Caso contrário, trava. Ao usar o subshell, o cmd retorna mesmo se o log não estiver sendo gravado ativamente. Então eu prefiro o comando subshell, mas
sh
não suporta subshells.Além disso, observei ao testar em um log ativo que o uso de
bash
vs.sh
tem tempo diferente. Por algum motivo,sh
leva um segundo a mais para responder, em seguida,bash
.Por esses dois motivos (usando subshell e atraso em
sh
overbash
), decidi quesh
não é a solução adequada. -
Em terceiro lugar, em resposta à resposta do ilkkachu sobre o desnecessário & para
tail
. Isso está correto, eu removi e não teve impacto.
Resumo:
sudo su vs. su
//prompts for password w/out sudo
su -c 'timeout 200 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)''
//works
sudo su -c 'timeout 200 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'
usando sh -c
//either works (sudo or not using sudo)
//but both won't work unless log is actively being written to for some reason
sudo sh -c 'tail -n100 -f /path/to/nameOfLog.log | grep -q "Started .*Application"'
sh -c 'tail -n100 -f /path/to/nameOfLog.log | grep -q "Started .*Application"'
usando o bash
//either works (sudo or not using sudo)
sudo bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'
bash -c 'timeout 5 grep -q "Started .*Application" <(tail -n100 -f /path/to/nameOfLog.log &)'
NOVA Solução:
Percebi que deixei de fora um detalhe importante . O que é que isso estava sendo executado por meio de um provisionador de execução remota do terraform . O Terraform cria um script .sh local em / tmp / no servidor para quaisquer comandos in-line . O comunicador / ssh / communicator.go define #!/bin/sh
no parte superior dos scripts, o que significa que eles estão usando sh
. Então, como estou usando um subshell, preciso usar o bash. O uso de sudo não é necessário e foi meu mal entendido. No entanto, você ainda pode usar o sudo. Então a resposta com a qual eu fui é um dos comandos usando o bash listados no Resumo acima.
P.S. meus servidores de destino, neste caso, estavam executando 14.04.1-Ubuntu . A execução de ls -l /bin/sh
mostra /bin/sh -> dash
, portanto, na verdade, não estou usando sh
, mas traço. Portanto, parece que dash
tem os mesmos contratempos de sh
.