これを行うシェルスクリプトを作成したいと思います。
擬似コードで、私がやりたいこと:
tmux new -s my_session
Ruby run.rb # NOTE: I want this to run inside the my_session tmux session.
tmux detach
どうすればいいですか? (私が読んだより多くの投稿、それがより混乱します。)
#!/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
コマンドを実行すると、全員がファイルを読み取って実行できるようになり、ファイルの所有者もファイルに書き込むことができます。これは、Webサーバー経由で実行するPerlおよびその他のスクリプトで必要になる場合があります。 755をディレクトリに適用すると、全員がそのディレクトリにアクセスしてそのファイルリストを取得できることを意味します。
これらの許可は通常、rwxr-xr-x
のテキスト表現に変換されます。
または、ファイルでchmod +x file_name
を使用して実行可能にすることもできます。
KM Rakibul Islamの更新されたコードには、「no client found」(my_sessionは既に切り離されているため、tmuxがどのセッションを希望するかを理解できないため、切り離す)。正しいコードは次のとおりです。
#!/bin/bash
tmux new-session -d -s my_session 'Ruby run.rb'
teamocil を使用してこれを簡単に行うことができます。 YAMLファイルを作成するだけです:
windows:
- name: rubysession
root: ~
layout: tiled
panes:
- Ruby run.rb; tmux detach
「rubysession.yml」という名前を付けた場合、次を実行します。
teamocil rubysession
そして、それはあなたの目的のために完璧に機能し、ハックを必要としません。また、teamocilは他の多くの用途にも最適です!
いくつかのコマンドを開始した後にtmuxセッションを維持したい場合、可能な解決策はinitファイルで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などのシステム全体の初期化ファイルを読み取るためのものであるため、スクリプトでこれらを「ソース」にしたい場合があることに注意してください。
これがまだあなたにとって興味深いかどうかはわかりませんが、答え/ヒントを提供したいと思います:たとえば、シェルスクリプトで複数の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を作成します。その後、2つのフォルダーで配列を定義し、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
Gistファイルへのリンクは次のとおりです。 https://Gist.github.com/AICDEV/cf1497793bb1c27cb9b94d56c209ad6f
いくつかの実験で、シェルスクリプトを介して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セッションを2つのウィンドウに分割し、両方でhtop
を実行します。
元の質問に答えるには、Rubyスクリプトを実行し、以下のコマンドでtmuxセッションを切断しないでください。
tmux new-session -s Ruby_session 'Ruby run.rb'; # open tmux session and run Ruby script.