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


13

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

我需要的:

我需要一种方法可以一次完成以下3个动作:

  1. 附加新tmux会话。
  2. 向该会话注入一组准备好的命令,例如(sleep 30m ; rm -rf dir_name ; exit)。我特别希望使用多行设置,而不是一排排。
  3. 在新tmux会话中将其完成写为stdin的那一刻执行上面的命令。

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


笔记:

  • 我的目标是在我最初的工作会议上做所有事情(我大部分时间都在工作)。通常,我无意访问新创建的会话,我只想使用自动执行的代码来创建它,仅此而已。

  • 如果可能的话,我希望有一个Heredoc解决方案。我认为这是最有效的。

Answers:


18

如果将要执行的代码放在例如/opt/my_script.sh,则很容易执行所需的操作:

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

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

我认为是最直接,最优雅的解决方案。我不知道使用tmux从stdin(从“ fromdocs”中读取)执行命令的任何简便方法。通过黑客入侵,您甚至可以做到这一点,但它仍然(并且看起来)是黑客。

例如,这是一种黑客,它使用我上面建议的命令来模拟您想要的行为(=从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

1
亲爱的马里奥 总是很高兴阅读您的答案。我不确定我是否理解正确,请告诉我是否错误:1.这样做的方法有两种,一种涉及第一种方法,即创建一个临时脚本(包含代码)并通过创建执行它,第二种方法是heredoc办法。2.如果第二种方法有效(当每个回显行包含heredoc的每个代码行时),如果它是Bash有效代码,为什么我们应该将其视为黑客?也许是因为Heredoc的行被回显并且在Heredocs中没有定期执行?
JohnDoea

2
@Benia这是一个hack,因为它仅在具有的某些Unix系统上有效/dev/shm。这也是一个hack,因为它比简单地将脚本写入普通文件并以开头更复杂,更难以阅读,理解和维护tmux
库沙兰丹

1
正如@Kusalananda所解释的那样,这里的代码执行文档通常是不好的做法。它虽然很丑陋且难以维护,但确实有效,但是它迫使您找到回旋的方式来完成其他非常简单的事情……只需在答案中比较第一和第二代码块:您能告诉它如何工作吗?您需要花费多长时间?这是一劈为TMUX没有从标准输入执行命令(除偶更哈克的方式这么难看我甚至不会考虑)的方式,所以外部脚本是唯一的(答案1.你的问题)的方式。
Mario Vitale

1
抱歉,第一个示例中有一个错误(如果使用参数,则不暗含“ new-session”命令)。现在已修复。
马里奥·维塔莱

1
现在,当我执行tmux new-session -d -s "myTempSession" /opt/my_script.sh该命令时,它不会打开临时文件供我粘贴代码...我需要的是直接从当前会话中打开脚本,或者至少要移动到新会话中,然后直接返回到当前会话。顺便说一句,我计划为您的所有帮助提供赏金,因为这是我最能感谢您的事情,我会在11小时内给予赏金。
JohnDoea

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.