0 votos positivos 0 votos negativos
333 visitas
em Shell GNU por colaborador (6,8K pontos)

O cenário é o seguinte:

Num shell foi digitado um comando:

comando

O comando demora algumas horas para rodar. Depois de rodar o aluno percebeu que deveria ter rodado.

comando && poweroff

Para desligar o sistema caso o processo terminasse com sucesso.

A ideia então é saber se há algum modo de alterar a linha depois que foi digitada, como para incluir && poweroff.

por monitor (15,8K pontos)
0 0
Depende do que você quer dizer com "alterar" e "linha de comandos", já que o shell GNU também permite a geração dinâmica de linhas de comandos através de várias técnicas. Aproveitando a oportunidade, eu recomendo muito a palestra de um grande amigo e professor que explica muito bem como fazer perguntas de forma eficiente em meios eletrônicos: https://www.youtube.com/watch?v=D5fipnSQ9P0 Outro aforismo do mesmo professor é algo como: "este é o seu problema ou é o que você acha que é uma solução para o seu problema?" :-P No futuro, caso a experiência não dê muito certo, é bem possível que a opção de não detalhar as perguntas nesta plataforma seja desabilitada.
por colaborador (6,8K pontos)
0 0
Hehe, o caso pode ser reslvido de outras formas sim.
Essa dúvida surgiu de um aluno do cursognu.

O cenário é o seguinte:

Num shell foi digitado um comando:
comando

O comando demora algumas horas para rodar. Depois de rodar o aluno percebeu que deveria ter rodado.

comando && poweroff

Para desligar o sistema caso o processo terminasse com sucesso.

A ideia então é saber se há algum modo de alterar a linha depois que foi digitada, como para incluir && poweroff.

1 Resposta

0 votos positivos 0 votos negativos
por monitor (15,8K pontos)
selecionada por
 
Melhor resposta

Então, isso não seria um caso de alterar uma linha de comando dada e em execução. Neste caso, o problema dele é dar um poweroff após o término da execução do comando executado.

Uma das formas de fazer isso é com o comando wait. Com ele, nós podemos fazer o shell aguardar o término de outro comando antes de executar alguma outra coisa. Por exemplo:

:~$ sleep 60 &
[1] 16087
:~$ wait 16087; echo "terminou"
[1]+  Concluído              sleep 60
terminou
:~$ 

Aqui, o utilitário sleep ficará em execução em segundo plano por 60 segundos. Antes de seu término, eu utilizei o seu PID com o comando wait, que só permitirá a execução do comando echo quando o sleep terminar.

Caso você não saiba o PID do processo inicial (o tal comando), um ps -C comando pode ajudar.

Mais sobre o builtin wait:

:~$ help wait
por colaborador (6,8K pontos)
0 0
Perfeito, eu sugeri a ele usar o ps para descobrir o PID e um while num bash script para monitorar o PID, não conhecia o wait.

Nesse cenário a solução usando wait é perfeita, mas ainda continuo com a dúvida de se é possível alterar uma linha de comandos em execução! hehe.
por colaborador (6,8K pontos)
0 0
Acabo de testar aqui, o wait funciona, se for o mesmo terminal.

O comando que ele rodou, rodou sem o &, portanto antes teria que colocar em segundo plano.
por monitor (15,8K pontos)
0 0
Neste caso, a sua solução é a que funciona, porque o wait só monitora processos filhos da mesma sessão do shell (não só do terminal, poderia ser de um script, por exemplo). Poderia ser assim:

while ps -p <pid> &>/dev/null; do sleep <intervalo>; done; <comando>
por monitor (15,8K pontos)
0 0
> mas ainda continuo com a dúvida de se é possível alterar uma linha de comandos em execução! hehe.

É possível! A mais fácil e mandar um 'kill'... hehehe
Seja bem-vindo(a) à comunidade debxp, onde você pode fazer perguntas e receber respostas de outros membros.
Atenção pessoal, esta plataforma não é um fórum, embora se pareça muito com um. Neste tipo de ferramenta, o objetivo é fazer e responder perguntas que possam resultar em material de consulta para outras pessoas que tenham as mesmas dúvidas e dificuldades. Portanto, não há sentido em utilizarmos o Ask para socialização, para emitir opiniões pessoais ou para perguntas do tipo "quem usa isso ou aquilo". Espero que compreendam o nosso propósito. :-)
...