Come eseguire il codice in una nuova sessione di tmux - dall'interno della sessione corrente?


13

Uso Ubuntu 16.04 e ho bisogno della seguente tmuxsoluzione perché voglio eseguire un processo di timeout con sleepcome nel mio caso particolare non ero soddisfatto ate ho riscontrato un bug con nohup(durante la combinazione nohup-sleep). Ora, tmuxsembra la migliore alternativa in quanto ha il suo meccanismo di non blocco e in realtà funziona benissimo nell'uso manuale (faccio la domanda solo per quanto riguarda l'automazione del processo che posso già fare manualmente con esso).

Ciò che di cui ho bisogno:

Ho bisogno di un modo per eseguire le seguenti 3 azioni, tutto in un'unica operazione:

  1. Allegare una nuova tmuxsessione.
  2. Iniettando un set pronto di comandi a quella sessione, come (sleep 30m ; rm -rf dir_name ; exit). Preferirei in particolare un set multilinea e non una riga lunga.
  3. L'esecuzione del comando precedente imposta il momento in cui è stato finito per essere scritto come stdin in una nuova tmuxsessione.

In altre parole, voglio eseguire un set di codici in un'altra tmuxsessione che è stato creato appositamente per quella causa, ma per fare tutto in un'unica operazione.


Appunti:

  • Intendo fare tutto dalla mia sessione di lavoro originale (quella che lavoro dalla maggior parte delle volte). In generale, non ho intenzione di visitare la sessione appena creata, voglio solo crearla con il suo codice eseguito automaticamente e basta.

  • Se possibile, preferirei una soluzione ereditaria. Penso che sia più efficiente.

Risposte:


18

Se inserisci il codice che vuoi eseguire, ad esempio /opt/my_script.sh, è molto facile fare quello che vuoi:

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

Ciò avvia una nuova sessione distaccata, denominata "myTempSession", eseguendo lo script. Successivamente puoi collegarti ad esso per vedere cosa sta facendo eseguendo tmux attach-session -t myTempSession.

Questa è secondo me la soluzione più semplice ed elegante. Non sono a conoscenza di alcun modo semplice per eseguire comandi da stdin (leggi "da heredocs") con tmux. Con l'hacking in giro potresti anche essere in grado di farlo, ma sarebbe comunque (e sembrerà) un hack.

Ad esempio, ecco un trucco che utilizza il comando che ho suggerito sopra per simulare il comportamento desiderato (= esegui il codice in una nuova sessione di tmux da un heredoc. Non viene eseguita alcuna scrittura sul disco rigido del server, mentre viene creato il file temporaneo /dev/shm, che è 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

1
Caro Mario. Sempre un piacere leggere le tue risposte. Non sono sicuro di aver capito bene, per favore dimmi se sbaglio: 1.ci sono due modi per farlo, uno prevede prima di creare uno script temporaneo (che contiene il codice) ed eseguirlo con la creazione e il secondo è un ereditario modo. 2.Se il secondo modo funziona (quando ogni riga dell'eco contiene ogni riga di codice dell'ereditarietà) perché dovremmo vederlo come un hack se è un codice valido di Bash? Forse perché le righe dell'eredoc sono echeggiate e non eseguite regolarmente negli heredoc?
JohnDoea,

2
@Benia È un hack poiché funziona solo su alcuni sistemi Unix che hanno /dev/shm. È anche un trucco poiché è più complicato, difficile da leggere, comprendere e mantenere piuttosto che scrivere semplicemente lo script in un file ordinario e iniziarlo con tmux.
Kusalananda

1
Come ha spiegato @Kusalananda, gli heredoc per l'esecuzione del codice sono una cattiva pratica in generale. Anche se brutto e non sostenibile, funziona, ma ti costringe a trovare un modo rotonda di fare cose altrimenti molto semplici ... basta confrontare il primo e il secondo blocco di codice nella risposta: puoi dire come funziona? Quanto tempo impieghi per farlo? È ancora più un hack perché tmux non ha modo di eseguire comandi da stdin (salvo per modi ancora più disordinati così brutti che non prenderò nemmeno in considerazione), quindi gli script esterni sono l' unico modo (risposta alla 1.tua domanda) .
Mario Vitale,

1
Spiacenti, si è verificato un errore nel primo esempio (il comando "nuova sessione" non è implicito se si utilizzano argomenti). Ora è stato risolto.
Mario Vitale,

1
Ora quando lo eseguo tmux new-session -d -s "myTempSession" /opt/my_script.shnon si apre un file temporaneo per incollare il codice ... Ciò di cui ho bisogno è aprire lo script direttamente dalla sessione corrente, o almeno qualcosa per passare alla nuova sessione e poi tornare direttamente alla sessione corrente. A proposito, ho in programma di dare ricompensa per tutto il tuo aiuto in quanto è il minimo che posso fare per ringraziarti e potrei dare ricompensa in 11 ore.
JohnDoea,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.