如何在tmux服务器/会话出口上执行清理命令?


4

为了改善我的工作流程,我编写了一些包装脚本,以便在我想要处理项目时自动启动一些命令。然而,当我完成并清理此特定会话的所有tmux选项卡时,我想杀死一些进程并清理一些文件。

退出tmux服务器时有没有办法自动执行命令?

想要的工作流程:

  • 执行命令来创建新的tmux服务器,打开一些文件,启动一些应用程序
  • 在会议中工作
  • 稍后分开工作
  • 重新安装
  • 当tmux服务器中的所有选项卡都关闭并且服务器被销毁时,执行清理命令

[edit]我目前使用的脚本:https//github.com/WoLpH/dotfiles/blob/master/bin/tmx


通过“清理命令”你的意思是服务器特定的命令?例如,您为项目A打开了一个会话,为项目B打开了另一个会话。所以您想在session_A关闭时执行cleanup_A?或者你的意思是不同的东西?
scicalculator 2013年

是的,这正是我的意思。但是一般的清理命令也可以工作,我可以很容易地从剩下的文件中推断出以前打开的项目。我只需要任何类型的post-server-exit触发器,这样我就可以卸载一些东西。
Wolph 2013年

我编写了一个命令行实用程序,用于编写tmux会话设置/拆解脚本:github.com/tarruda/tmuxer。它甚至包括替换'选择会话',让你选择'封闭'会议
Thiago de Arruda 2013年

@ThiadodeArruda:看起来很酷,我很快就会测试一下。目前我正在使用这个脚本:github.com/WoLpH/dotfiles/blob/master/bin/tmx
Wolph 2013年

@Wolph:我也将我的解决方案集成到dotfiles-zsh脚本中,最近我将其解压缩成一组可重复使用的posix兼容shell脚本,以便更好地移植并更容易被其他人重用
Thiago de Arruda 2013年

Answers:


6

目前,没有特定的方法让tmux自动运行由detach会话中的所有窗口触发或关闭的命令。但是,由于您已经有一个tmux_wrapper打开所需自定义会话的包装器脚本(我将调用它),您可以轻松地将此脚本转换为自动清理。我在这里做了一些与此类似的事情,如果我通过ssh附加,我想允许嵌套的tmux会话。

由于您有自定义体验,因此您不再需要tmux attach ....或类似命令,因此我假设您始终通过类似的方式启动项目A的会话tmux_wrapper A。在你的包装器中,你可能有一个类似于的行tmux new-session -s A。在这里,我们可以利用会话名称A。然后,在您的包装器的末尾,您可以拥有一个清理开关,只有在会话不再存在时才会激活(即窗口/窗格不再可连接)。

一个简单的例子tmux_wrapper看起来像这样:

#!/bin/sh

sess=$1

# test if the session has windows
is_closed(){ 
    n=$(tmux ls 2> /dev/null | grep "^$sess" | wc -l)
    [[ $n -eq 0 ]]
}

# either create it or attach to it
if is_closed ; then
  tmux new -s $sess
else
  tmux attach -t $sess
fi

# the session is now either closed or detatched
if is_closed ; then
    # perform cleanup here ...
fi

像那样运行它tmux_wrapper A。现在,当且仅当会话已完全关闭时,会话A将自动进行清理。


不是最漂亮的解决方案,但它应该工作:)谢谢!我确实有一个类似的剧本,你可以在这里找到它,如果你感兴趣的话:gist.github.com/WoLpH/3163775
Wolph 2013年
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.