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 suser redundante. Se eu removersudodo 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
shnão suporta subshells.Além disso, observei ao testar em um log ativo que o uso de
bashvs.shtem tempo diferente. Por algum motivo,shleva um segundo a mais para responder, em seguida,bash.Por esses dois motivos (usando subshell e atraso em
shoverbash), decidi queshnã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 .