如何编写启动tmux会话的shell脚本,然后运行ruby脚本

时间:2015-08-09 09:50:24

标签: ruby bash shell tmux

我想写一个执行此操作的shell脚本:

  • 首先,创建一个tmux会话
  • 其次,运行名为" run.rb"的ruby脚本。在tmux会话中

在伪代码中,我想做什么:

tmux new -s my_session
ruby run.rb     # NOTE: I want this to run inside the my_session tmux session.
tmux detach

我该怎么做? (我读的帖子越多,就会越混乱。)

6 个答案:

答案 0 :(得分:33)

#!/bin/bash
tmux new-session -d -s my_session 'ruby run.rb'
  1. 创建一个名为my_script.sh的文件,并为其提供上述内容。

  2. 运行以下命令使文件可执行:

    chmod 755 my_script.sh 要么 chmod +x my_script.sh

  3. 然后运行shell脚本:

    ./my_script.sh

  4. 使shell脚本可执行

    当您执行chmod 755 filename命令时,您允许每个人读取并执行该文件,并且文件所有者也可以写入该文件。对于应该通过Web服务器运行的Perl和其他脚本,您可能需要这样做。如果您将755应用于目录,则意味着每个人都可以访问它并获取其文件列表。

    这些权限通常会转换为rwxr-xr-x的文本表示形式。

    您也可以在文件上使用chmod +x file_name使其可执行。

答案 1 :(得分:21)

K M Rakibul Islam的更新代码在末尾包含一个不必要的分离命令,这会导致错误消息"没有找到客户端" ( my_session 已经分离,因此不在范围内,因此tmux无法理解您要分离的会话)。正确的代码应该是:

#!/bin/bash
tmux new-session -d -s my_session 'ruby run.rb'

答案 2 :(得分:3)

您可以使用teamocil轻松完成此操作。你可以创建一个YAML文件:

A:-

如果你将它命名为'rubysession.yml',那么运行:

windows:
  - name: rubysession
    root: ~
    layout: tiled
    panes:
      - ruby run.rb; tmux detach

这对你的目的完全有效,并且不需要黑客攻击。此外,teamocil非常适合其他用途!

答案 3 :(得分:0)

如果要在启动某些命令后保持tmux会话有效,可能的解决方案是使用初始化文件启动bash:

tmux new -d -s mysession "bash --init-file foo.script"

其中foo.script将包含您的命令。或者,您可以直接从命令行将命令输入到Shell:

tmux new -d -s mysession2 "bash --init-file <(echo ruby run.rb)"

请注意,--init-file用于读取系统范围的初始化文件,例如/etc/bash.bashrc,因此您可能希望在脚本中“获取”这些文件。

答案 4 :(得分:0)

我不确定这是否对您仍然很有趣,但是我想给您一个答案/提示:例如,如果您想通过shell脚本启动多个tmux会话并执行一些命令,则可以这样做就像这样:

# just for test and show case
mkdir test_1 test_2

echo "current tmux sessions"
tmux ls

echo "kill all tmux sessions"
tmux kill-server

declare -a directories=("test_1" "test_2")

for i in "${directories[@]}"
do
cd ${i}
pwd
tmux new -d -s ${i} "ls -la"
cd ..
done

为进行演示,脚本将创建一个文件夹test_1和test_2。之后,我用两个文件夹定义了一个数组,并在两个文件夹中运行,并使用当前文件夹名称启动tmux会话并执行命令“ ls -la”。

如果您想遍历当前目录中的所有子目录,请将“ $ {directories [@]}”中的“ for i”替换为“ *中的f”;做”。以下示例也排除了符号文件夹:

echo "current tmux sessions"
tmux ls

echo "kill all tmux sessions"
tmux kill-server dependencies

     for f in *; do
        if [[ -d "$f" && ! -L "$f" ]]; then
            cd ${f}
            pwd
            tmux new -d -s ${i} "ls -la"
            cd ..
        fi
    done

以下是要点文件的链接:https://gist.github.com/AICDEV/cf1497793bb1c27cb9b94d56c209ad6f

答案 5 :(得分:0)

通过一些实验,我弄清楚了如何通过shell脚本控制tmux。

tmux new-session -d -s htop-session 'htop';  # start new detached tmux session, run htop
tmux split-window;                             # split the detached tmux session
tmux send 'htop -t' ENTER;                     # send 2nd command 'htop -t' to 2nd pane. I believe there's a `--target` option to target specific pane.
tmux a;                                        # open (attach) tmux session.

上面的代码将tmux会话分为两个窗口,并在两个窗口中同时运行htop

要回答原始问题,您可以运行ruby脚本,而不用以下命令分离tmux会话:

tmux new-session -s ruby_session 'ruby run.rb';  # open tmux session and run ruby script.