Comment exécuter du code dans une nouvelle session tmux - depuis la session actuelle?

13

J'utilise Ubuntu 16.04 et j'ai besoin de la tmuxsolution suivante parce que je veux exécuter un processus de temporisation avec sleepcomme dans mon cas particulier je n'étais pas satisfait atet j'ai rencontré un bug avec nohup(lors de la combinaison nohup-sleep). Maintenant, tmuxsemble la meilleure alternative car il a son propre mécanisme sans raccrochage et fonctionne réellement bien en utilisation manuelle (je pose la question uniquement en ce qui concerne l'automatisation du processus, je peux déjà le faire manuellement).

Ce dont j'ai besoin:

J'ai besoin d'un moyen de faire les 3 actions suivantes, en une seule opération:

  1. Attacher une nouvelle tmuxsession.
  2. Injecter un ensemble de commandes prêt à cette session, comme (sleep 30m ; rm -rf dir_name ; exit). Je préférerais surtout un ensemble multi-lignes, et non une longue rangée.
  3. L'exécution de la commande ci-dessus définit le moment où elle a été écrite en tant que stdin dans la nouvelle tmuxsession.

En d'autres termes, je veux exécuter un ensemble de codes dans une autre tmuxsession qui a été spécialement créé pour cette cause, mais tout faire en une seule opération.


Remarques:

  • Mon objectif est de tout faire à partir de ma session de travail d'origine (celle sur laquelle je travaille la plupart du temps). En général, je n'ai pas l'intention de visiter la session nouvellement créée, je veux juste la créer avec son code exécuté automatiquement et c'est tout.

  • Si possible, je préférerais une solution hérédoc. Je pense que c'est le plus efficace.

JohnDoea
la source

Réponses:

18

Si vous mettez par exemple le code que vous souhaitez exécuter /opt/my_script.sh, il est très facile de faire ce que vous voulez:

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

Cela démarre une nouvelle session détachée, nommée "myTempSession", exécutant votre script. Vous pouvez ensuite l'attacher pour vérifier ce qu'il fait, en l'exécutant tmux attach-session -t myTempSession.

C'est à mon avis la solution la plus simple et la plus élégante. Je ne connais aucun moyen facile d'exécuter des commandes depuis stdin (lire "from heredocs") avec tmux. En piratant, vous pourriez même être en mesure de le faire, mais ce serait (et ressemblerait) à un piratage.

Par exemple, voici un hack qui utilise la commande que j'ai suggérée ci-dessus pour simuler le comportement que vous souhaitez (= exécuter du code dans une nouvelle session tmux à partir d'un hérédoc. Aucune écriture ne se produit sur le disque dur du serveur, car le fichier temporaire est créé /dev/shm, qui est un 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
la source
1
Cher Mario. Toujours un plaisir de lire vos réponses. Je ne sais pas si je comprends bien, dites-moi si je me trompe: 1.il y a deux façons de le faire, l'une consiste d'abord à créer un script temporaire (qui contient le code) et à l'exécuter avec creation et la seconde est un hérédoc façon. 2.Si la deuxième méthode fonctionne (lorsque chaque ligne d'écho contient chaque ligne de code de l'hérédoc), pourquoi devrions-nous voir cela comme un hack s'il s'agit d'un code valide Bash? Peut-être parce que les lignes de l'hérédoc sont répercutées et ne sont pas exécutées régulièrement dans les hérédocs?
JohnDoea
2
@Benia C'est un hack car il ne fonctionne que sur certains systèmes Unix /dev/shm. C'est aussi un hack car il est plus compliqué, difficile à lire, à comprendre et à maintenir que d'écrire simplement le script dans un fichier ordinaire et de commencer par tmux.
Kusalananda
1
Comme l'a expliqué @Kusalananda, les heredocs pour l'exécution de code sont de mauvaises pratiques en général. Bien que laid et non durable, cela fonctionne, mais cela vous oblige à trouver un moyen détourné de faire des choses autrement très simples ... comparez simplement les premier et deuxième blocs de code dans la réponse: pouvez-vous dire comment cela fonctionne? Combien de temps vous faut-il pour le faire? C'est encore plus un hack car tmux n'a aucun moyen d'exécuter des commandes depuis stdin (sauf pour des manières encore plus hacky si moche je ne le considérerai même pas), donc les scripts externes sont le seul moyen (réponse à la 1.question) .
Mario Vitale
1
Désolé, il y a eu une erreur dans le premier échantillon (la commande "new-session" n'est pas implicite si vous utilisez des arguments). Maintenant c'est réparé.
Mario Vitale
1
Maintenant, lorsque j'exécute, tmux new-session -d -s "myTempSession" /opt/my_script.shil ne s'ouvre pas un fichier temporaire pour moi de coller le code ... Ce dont j'ai besoin est d'ouvrir le script directement à partir de la session en cours, ou au moins quelque chose pour passer à la nouvelle session, puis revenir directement à la session actuelle. BTW J'ai l'intention de donner une prime pour toute votre aide car c'est le moins que je puisse faire pour vous remercier et je pourrais donner une prime dans 11 heures.
JohnDoea