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

19 tmux timeout here-document

我使用 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 解决方案。我认为这是最有效的。

Mar*_*ale 35

如果将要执行的代码放在 eg 中/opt/my_script.sh,则很容易执行您想要的操作:

tmux new-session -d -s "myTempSession" /opt/my_script.sh
Run Code Online (Sandbox Code Playgroud)

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

在我看来,是最直接、最优雅的解决方案。我不知道使用 tmux 从标准输入(读取“来自heredocs”)执行命令的任何简单方法。通过在周围进行黑客攻击,您甚至可以做到这一点,但它仍然(并且看起来)是一次黑客攻击。

例如,这里有一个 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
Run Code Online (Sandbox Code Playgroud)

  • @Benia 这是一个 hack,因为它只适用于一些具有 `/dev/shm` 的 Unix 系统。这也是一种 hack,因为它比简单地将脚本写入普通文件并以 tmux 开头更复杂、更难阅读、更难理解和更难维护。 (3认同)