Как написать оболочку script, которая запускает сеанс tmux, а затем запускает ruby ​​script

Я хочу написать оболочку script, которая делает это:

  • Сначала создайте сеанс tmux
  • Во-вторых, запустите ruby ​​ script под названием "run.rb" INSIDE в сеансе tmux

В псевдокоде, что я хочу сделать:

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

Как мне это сделать? (Больше сообщений, которые я читал, более запутанным становится.)

Ответ 1

#!/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. Затем запустите скрипт оболочки:

    ./my_script.sh

Создание исполняемого скрипта

Когда вы выполняете команду chmod 755 filename вы разрешаете всем читать и выполнять файл, а владельцу файла также разрешается записывать в файл. Это может понадобиться для Perl и других скриптов, которые должны запускаться через веб-сервер. Если вы примените 755 к каталогу, это означает, что каждый может перейти к нему и получить его список файлов.

Эти разрешения обычно переводятся в текстовое представление rwxr-xr-x.

Вы также можете использовать chmod +x file_name для файла, чтобы сделать его исполняемым.

Ответ 2

K M Обновленный код Rakibul Islam содержит ненужную команду отсоединения в конце, которая вызывает сообщение об ошибке "no client found" (my_session уже отсоединен и, следовательно, не входит в область, поэтому tmux не может понять, какой сеанс вы хотите отделить). Правильный код должен быть:

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

Ответ 3

Вы можете использовать teamocil, чтобы сделать это легко. Вы можете просто создать файл YAML:

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

Если вы назвали его "rubysession.yml", запустите:

teamocil rubysession

И это будет отлично работать для вашей цели и не требует хаков. Кроме того, teamocil отлично подходит для других целей!

Ответ 4

Если вы хотите сохранить сеанс tmux после запуска некоторых команд, возможное решение - запустить bash с файлом инициализации:

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

где foo.script будет содержать ваши команды. Кроме того, вы можете передать команду в оболочку непосредственно из командной строки:

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

Обратите внимание, что --init-file предназначен для чтения общесистемных файлов инициализации, таких как /etc/bash.bashrc, поэтому вы можете захотеть "найти" их в своем скрипте.

Ответ 5

Я не уверен, что это все еще интересно для вас, но я хотел бы дать вам ответ/подсказку: если вы хотите, например, запустить несколько сеансов 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".

Если вы хотите просмотреть все подкаталоги в текущем каталоге, замените "for i в" $ {directoryies [@]} "на" для f в *; do ". Вот пример, который также исключает символические папки:

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

Вот ссылка на файл gist: https://gist.github.com/AICDEV/cf1497793bb1c27cb9b94d56c209ad6f

Ответ 6

Немного поэкспериментировав, я понял, как управлять 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 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.