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

hac*_*r15 38 ruby bash shell tmux

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

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

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

tmux new -s my_session
ruby run.rb     # NOTE: I want this to run inside the my_session tmux session.
tmux detach
Run Code Online (Sandbox Code Playgroud)

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

K M*_*lam 39

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

  2. 通过运行使文件可执行:

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

  3. 然后运行shell脚本:

    ./my_script.sh

使shell脚本可执行

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

这些权限通常被翻译成文本表示rwxr-xr-x.

您也可以使用chmod +x file_name文件使其可执行.

  • 这不适合我.给我会话找不到错误:$ cat tmux_sh.sh#!/ bin/bash echo"step 1"tmux new-session -d -s rtb123'vagrant up'echo"step 2"tmux detach -s rtb123 ./tmux_sh.步骤1步骤2找不到会话:rtb123 (3认同)
  • 创建新会话时,“bash”脚本将被搁置,因为当您仍附加到新会话时,第一个“tmux”命令不会退出。 (2认同)

Nic*_*ick 21

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

#!/bin/bash
tmux new-session -d -s my_session 'ruby run.rb'
Run Code Online (Sandbox Code Playgroud)

  • @Muddz,例如,您可以运行“第一个命令 && 第二个命令 && 等等”,或者您可以将命令放入 shell 脚本中并运行它而不是命令:“sh /path/to/script.sh” (2认同)

Qua*_*Van 14

通过一些实验,我想出了如何通过 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.
Run Code Online (Sandbox Code Playgroud)

以上将 tmux 会话拆分为两个窗口,并htop在两个窗口中运行。

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

tmux new-session -s ruby_session 'ruby run.rb';  # open tmux session and run ruby script.
Run Code Online (Sandbox Code Playgroud)


jer*_*ent 8

如果你想在启动一些命令后保持 tmux 会话处于活动状态,一个可能的解决方案是使用 init 文件启动 bash:

tmux new -d -s mysession "bash --init-file foo.script"
Run Code Online (Sandbox Code Playgroud)

其中 foo.script 将包含您的命令。或者,您可以直接从命令行向 shell 提供命令:

tmux new -d -s mysession2 "bash --init-file <(echo ruby run.rb)"
Run Code Online (Sandbox Code Playgroud)

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