Considere a seguinte nohup
execuçã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 nohup
execuçã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 tmux
ou 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 ignoradoSIGHUP
e redirecionadostdout/stderr
para um arquivonohup.out
, para que o comando possa continuar em execução em segundo plano após o logout.
nohup
nã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’
jobs
pode imprimir trabalhos atualmente em execução e seu status. Se o comando jobs
nã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, fg
mesmo 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 init
processo. Se você pesquisar, pstree
verá 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 sleep
trabalho com o mesmo PID impresso quando o gerou, enquanto jobs
nã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.