Как написать оболочку 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'
-
Создайте файл с именем my_script.sh
и передайте ему указанное выше содержимое.
-
Сделайте файл исполняемым, запустив:
chmod 755 my_script.sh
или chmod +x my_script.sh
-
Затем запустите скрипт оболочки:
./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.