如何在当前会话中的新 tmux 会话中执行代码?

如何在当前会话中的新 tmux 会话中执行代码?

我使用 Ubuntu 16.04,我需要以下tmux解决方案,因为我想运行一个超时过程,因为sleep在我的特定情况下,我不满意at并遇到了错误nohup(在组合时nohup-sleep)。现在,tmux似乎是最好的选择,因为它有自己的不挂断机制,并且实际上在手动使用中工作得很好(我只问关于自动化我已经可以手动执行的过程的问题)。

我需要的:

我需要一种方法来完成以下 3 个操作,全部在一个操作中:

  1. 附加一个新tmux会话。
  2. 向该会话注入一组准备好的命令,例如(sleep 30m ; rm -rf dir_name ; exit).我特别喜欢多行集,而不是一长行。
  3. tmux执行上述命令后,将在新会话中将其写入标准输入。

换句话说,我想在tmux专门为此目的创建的另一个会话中执行代码集,但要在一个操作中完成所有操作。


笔记:

  • 我的目标是从最初的工作会议(我大部分时间都在工作)完成所有工作。一般来说,我无意访问新创建的会话,我只想用其自动执行的代码创建它,仅此而已。

  • 如果可能的话,我更喜欢heredoc解决方案。我认为这是最有效的。

答案1

如果你把你想要执行的代码放在eg中/opt/my_script.sh,就很容易做你想做的事:

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

这将启动一个名为“myTempSession”的新分离会话,并执行您的脚本。您稍后可以通过执行附加到它来检查它正在做什么tmux attach-session -t myTempSession

在我看来,这是最直接、最优雅的解决方案。我不知道有什么简单的方法可以使用 tmux 从 stdin (阅读“来自此处文档”)执行命令。通过黑客攻击,你甚至可以做到这一点,但它仍然是(并且看起来像)黑客攻击。

例如,这里有一个 hack,它使用我上面建议的命令来模拟您想要的行为(= 从heredoc在新的 tmux 会话中执行代码。在创建临时文件时,服务器的硬盘驱动器上不会发生写入,/dev/shm即一个 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

答案2

另请参阅https://serverfault.com/questions/339390/run-command-in-detached-tmux-session有关使用的示例发送密钥分离窗格上的命令。

答案3

混合上述解决方案我想出了另一种方法来实现相同的目的(假设是 bash):

#!/bin/bash

wantTmuxExecute() {
   sleep 30m ;
   rm -rf dir_name ; 
   ...
}
# send to tmux
type wantTmuxExecute | tail -n +2 > /dev/shm/wantInTmux.sh

# execute tmux
tmux new-session -d 'source /dev/shm/wantInTmux.sh ; rm /dev/shm/wantInTmux.sh'
tmux send-keys 'wantTmuxExecute'

相关内容