Considere a seguinte nohupexecução:
nohup script.sh > script.out &
Existe uma maneira de fazer logoff do terminal, reconectar, trazer o processo de volta ao primeiro plano e interagir com ele usando o teclado?
Considere a seguinte nohupexecução:
nohup script.sh > script.out &
Existe uma maneira de fazer logoff do terminal, reconectar, trazer o processo de volta ao primeiro plano e interagir com ele usando o teclado?
Respostas:
Se você deseja iniciar um script, execute-o sem que a saída incomode o terminal e, em seguida, traga-o posteriormente para interagir com ele, consulte um multiplexador de terminal. Dependendo do seu sistema, eu recomendaria tmuxou screen. Você pode encontrar algumas informações sobre como usá-los nos links abaixo:
tmux:
tela:
edit: links adicionados para os primers tmux
nohup não desconecta um comando do terminal, faz com que seu script seja ignoradoSIGHUPe redirecionadostdout/stderrpara um arquivonohup.out, para que o comando possa continuar em execução em segundo plano após o logout.
nohupnão coloca automaticamente o comando executado em segundo plano. É preciso fazer isso explicitamente, encerrando a linha de comando com um &.
$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’
jobspode imprimir trabalhos atualmente em execução e seu status. Se o comando jobsnão puder encontrá-lo, não será mais um processo filho desse shell.
$ jobs
[1]+ Running nohup ./script.sh &
Pode-se trazer de volta um trabalho em segundo plano para o primeiro plano no bash, fgmesmo que seja executado com ele nohup. Mas isso não mudará o redirecionamento de saída, que ainda estará indo para o arquivonohup.out .
$ fg
nohup ./script.sh
Se você fechar o shell / terminal ou efetuar logoff, seu comando não será mais filho desse shell. Pertence ao initprocesso. Se você pesquisar, pstreeverá que agora pertence ao processo 1 ( init). Isso não pode ser trazido de volta ao primeiro plano porque o primeiro plano não existe mais.
If the command jobs cannot find it, then it is no longer a child process of that shell.Isso é errado: tente esta sequência para ver como: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$. Após esse comando, você ainda verá o sleeptrabalho com o mesmo PID impresso quando o gerou, enquanto jobsnão imprimirá nada. A única maneira pela qual um processo filho pode deixar de ser filho é perder o pai (então o órfão se torna filho de init) ou bifurcar + sair (mas o PID muda, então não é o filho original).
Vou testar o uso de um multiplexador de terminal, mas o tmux , não a tela. A tela é, para todos os efeitos, sem manutenção. Sua configuração é uma arte sombria, provavelmente registrada pela primeira vez em um apêndice do Necronomicon. Tentar escrever sua própria configuração é um vislumbre de Cthulu. Seriamente. Veja os arquivos .screenrc das pessoas . Para ter certeza, existem maneiras de mediar a abominação da tela de um arquivo de configuração. Byobu faz um trabalho admirável como o véu entre usuários mortais e códigos profanos. Ele vem com cores sensíveis, uma interface de menu e, talvez o mais importante, uma barra de status.
Mas como eu disse, eu recomendo o tmux . Ele ainda requer algumas configurações menores, mas está bem documentado , e seu arquivo de configuração não parecerá sem sentido. Além disso, você começa com cores e uma barra de status. Compare meus arquivos screenrc e tmux.conf:
Qualquer comando do Linux pode ser enviado para segundo plano com ' &' anexado no final.
Para visualizar todos os trabalhos em segundo plano, você pode emitir jobs
jobs
[1] + suspended nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2] running nohup sh kafka-server-start.sh ../config/server.properties
[3] - running nohup sudo mongod --dbpath=/var/lib/mongodb
Aqui estou executando três tarefas em segundo plano: zookeeper, kafka e mongo daemon. [1], [2] e [3] são os respectivos números de trabalho para essas tarefas.
Você pode colocar essas tarefas em primeiro plano usando fg %$taskNumber.