Coloque o trabalho nohup em primeiro plano

14

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?

Adam Matan
fonte

Respostas:

7

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

Gus E
fonte
+1 Excelente ferramenta que eu não conhecia. Muito Obrigado.
Adam Matan
19

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.

souravc
fonte
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).
Ruslan
4

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:

djeikyb
fonte
0

Se você está apenas interessado em olhar ao vivo, a saída pode ser adequada para você:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out
confundir
fonte
0

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.

Sudip Bhandari
fonte