Perl alternativa para screen / tmux para o mundo UNIX?

5

O que acontece quando uma solução de tela / tmux é necessária (para deixar um processo em execução por um longo tempo, mas não com nohup porque a interação pode ser necessária) - mas o screen / tmux não está disponível na máquina fornecida , e instalando tela / compilação não é uma solução?

P: Há algum script "curto" em perl que possa ser geralmente (ou não geralmente) usado para atingir este objetivo (no Linux / AIX / etc)?

apenas isso é necessário:

  1. inicie o script perl
  2. inicie a coisa que leva muito tempo
  3. de-anexar do terminal, ex .: porque o notebook em funcionamento precisa ser fechado para baixo
  4. reconecte-se ao console para ver / controlar o início da execução longa processo, assim como na tela

Alguém tem um script em perl como este?

    
por newuser999 04.09.2013 / 21:50

3 respostas

11

perl pode não ser o mais adequado, a menos que o módulo IO::Pty esteja instalado.

Primeiro, talvez você não precise de nada complicado se o dado-que-leva-longo-tempo (gtttlt) pode funcionar bem com canos.

mkfifo input
nohup gtttlt <> input > output 2>&1 &

para iniciar o gtttlt (entrada de um pipe nomeado, saída para um arquivo regular). Então você anexa a ele com:

tail -f output & cat > input

Se os canais não funcionarem e você precisar de um terminal, convém usar algo que possa iniciar um pseudo-terminal como expect , zsh zpty , perl ' IO::Pty ou sshd :

mkfifo input
nohup ssh -tt localhost gtttlt <> input > output 2>&1

E para anexar :

stty raw -echo; tail -f output & cat > input

Observe que não é como implementar screen ou tmux . screen e tmux implementam um emulador de terminal. Quando você reconecta, você vê o conteúdo da tela desse emulador de terminal. Aqui, quando você reconecta, você vê apenas as últimas 10 linhas de saída (embora seja possível ajustar passando uma opção -n 123 para tail ). E estamos apenas passando todos os dados para / do terminal host.

    
por 04.09.2013 / 22:46
2

Isso não é exatamente o que você pediu, mas eu uso at para fazer isso. Muitas vezes eu lanço comandos em servidores remotos do meu laptop e, em seguida, quero desligar o laptop sem perder a saída do comando. at me permite lançar tarefas em um determinado momento e eu apenas redireciono os fluxos de saída e erro do trabalho para arquivos.

Por exemplo, se eu quiser executar my_script.pl , criarei um pequeno arquivo chamado foo.txt com o seguinte conteúdo:

my_script.pl > out 2>er

e depois executá-lo com

$ at now < foo.txt

Eu posso fazer logoff do servidor, levar meu laptop para casa e verificar a saída por ssh ing para o servidor e executar

$ tail -f er

ou

$ tail -f out

Você também pode dar at jobs a partir do seu shell (pressione Ctrl D para sair):

$ at now
warning: commands will be executed using /bin/sh
at> my_script.pl > out 2>er
at> <EOT>
job 10 at Thu Sep  5 00:39:00 2013
    
por 05.09.2013 / 00:41
0

Como alternativa à sugestão "at" acima, gosto mais desta:

  1. Inicie seu script perl como de costume "perl script.pl"
  2. Faça o material de interação do usuário e entre na parte que leva muito tempo
  3. pressione ctrl + z para colocá-lo em segundo plano e digite "bg". O processo é executado agora no plano de fundo
  4. execute "jobs" para ver o número do seu processo. É muito provavelmente 1.
  5. execute "disown% 1" para refinar o programa para o seu terminal atual.
  6. agora você está seguro para fechar o terminal (digite "exit" ou apenas pressione o botão Fechar)

Além disso, você pode redirecionar a saída para um arquivo ou pipe nomeado. Infelizmente, não acho que haja uma maneira de anexar o processo novamente ao seu terminal.

    
por 15.01.2014 / 21:23

Tags