我使用 Ubuntu 16.04,我需要以下tmux
解决方案,因为我想运行一个超时过程,因为sleep
在我的特定情况下,我不满意at
并遇到了错误nohup
(在组合时nohup-sleep
)。现在,tmux
似乎是最好的选择,因为它有自己的不挂断机制,并且实际上在手动使用中工作得很好(我只问关于自动化我已经可以手动执行的过程的问题)。
我需要的:
我需要一种方法来完成以下 3 个操作,全部在一个操作中:
- 附加一个新
tmux
会话。 - 向该会话注入一组准备好的命令,例如
(sleep 30m ; rm -rf dir_name ; exit)
.我特别喜欢多行集,而不是一长行。 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'