Como executar o código em uma nova sessão do tmux - de dentro da sessão atual?

13

Eu uso o Ubuntu 16.04 e preciso da seguinte tmuxsolução, porque quero executar um processo de tempo limite com, sleepcomo no meu caso particular, não estava satisfeito ate encontrei um erro com nohup(ao combinar nohup-sleep). Agora, tmuxparece a melhor alternativa, pois possui seu próprio mecanismo no-hangup e, na verdade, está funcionando bem no uso manual (faço a pergunta apenas em relação à automação do processo que já posso fazer manualmente).

O que eu preciso:

Preciso de uma maneira de executar as três ações a seguir, tudo em uma operação:

  1. Anexando uma nova tmuxsessão.
  2. Injetando um conjunto pronto de comandos para essa sessão, como (sleep 30m ; rm -rf dir_name ; exit). Eu preferiria especialmente um conjunto de várias linhas, e não uma fila longa.
  3. A execução do comando acima definiu o momento em que foi finalizado para ser gravado como stdin em nova tmuxsessão.

Em outras palavras, desejo executar um conjunto de códigos em outra tmuxsessão criada especialmente para essa causa, mas fazer tudo em uma operação.


Notas:

  • Pretendo fazer tudo da minha sessão de trabalho original (aquela em que trabalho na maioria das vezes). Geralmente, não tenho intenção de visitar a sessão recém-criada, só quero criá-la com seu código executado automaticamente e é isso.

  • Se possível, eu preferiria uma solução heredoc. Eu acho que é mais eficiente.

JohnDoea
fonte

Respostas:

18

Se você colocar o código que deseja executar, por exemplo /opt/my_script.sh, é muito fácil fazer o que deseja:

tmux new-session -d -s "myTempSession" /opt/my_script.sh

Isso inicia uma nova sessão desanexada, denominada "myTempSession", executando seu script. Posteriormente, você pode anexá-lo para verificar o que está fazendo, executando tmux attach-session -t myTempSession.

Essa é, na minha opinião, a solução mais direta e elegante. Não conheço nenhuma maneira fácil de executar comandos do stdin (leia "do heredocs") com o tmux. Ao hackear você pode até conseguir fazer isso, mas ainda assim seria (e parece) um hack.

Por exemplo, aqui está um hack que usa o comando sugerido acima para simular o comportamento que você deseja (= executar código em uma nova sessão do tmux a partir de um heredoc. Nenhuma gravação ocorre no disco rígido do servidor, pois o arquivo temporário é criado /dev/shm, o que é a tmpfs):

(
  cat >/dev/shm/my_script.sh &&
  chmod +x /dev/shm/my_script.sh &&
  tmux new-session -d '/dev/shm/my_script.sh; rm /dev/shm/my_script.sh'
) <<'EOF'
    echo "hacky, but works"
EOF
Mario Vitale
fonte
1
Caro Mario. Sempre é um prazer ler suas respostas. Não sei se entendi direito, por favor me diga se estou errado: 1.Existem duas maneiras de fazer isso: uma envolve criar primeiro um script temporário (que contém o código) e executá-lo com a criação e a segunda é um heredoc caminho. 2.Se a segunda maneira funciona (quando cada linha de eco contém cada linha de código do heredoc), por que devemos ver isso como um hack, se for um código válido do Bash? Talvez porque as linhas do heredoc são repetidas e não executadas regularmente nos heredocs?
precisa saber é o seguinte
2
@Benia É um hack, pois só funciona em alguns sistemas Unix que possuem /dev/shm. Também é um truque, pois é mais complicado, difícil de ler, entender e manter do que simplesmente escrever o script em um arquivo comum e começar com ele tmux.
Kusalananda
1
Como o @Kusalananda explicou, os heredocs para execução de código são uma prática ruim em geral. Apesar de feio e inatingível, ele funciona, mas obriga a encontrar maneiras indiretas de fazer coisas muito simples ... basta comparar o primeiro e o segundo blocos de código na resposta: você pode dizer como funciona? Quanto tempo você leva para fazer isso? É ainda mais difícil, já que o tmux não tem como executar comandos do stdin (exceto por maneiras ainda mais hacky, tão feias que eu nem considerarei), então scripts externos são a única maneira (resposta à 1.sua pergunta) .
Mario Vitale
1
Desculpe, houve um erro no primeiro exemplo (o comando "new-session" não está implícito se você usar argumentos). Agora está consertado.
Mario Vitale
1
Agora, quando executo, tmux new-session -d -s "myTempSession" /opt/my_script.shele não abre um arquivo temporário para colar o código ... O que eu preciso é abrir o script diretamente da sessão atual ou pelo menos algo para mover para a nova sessão e, em seguida, voltar diretamente para o sessão atual. BTW, pretendo dar recompensa por toda a sua ajuda, pois é o mínimo que posso fazer para agradecer e posso dar uma recompensa em 11 horas.
precisa saber é o seguinte