web-dev-qa-db-ja.com

tmuxセッションを開始してからRubyスクリプトを実行するシェルスクリプトを作成する方法

これを行うシェルスクリプトを作成したいと思います。

  • まず、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

どうすればいいですか? (私が読んだより多くの投稿、それがより混乱します。)

36
hackstar15
#!/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コマンドを実行すると、全員がファイルを読み取って実行できるようになり、ファイルの所有者もファイルに書き込むことができます。これは、Webサーバー経由で実行するPerlおよびその他のスクリプトで必要になる場合があります。 755をディレクトリに適用すると、全員がそのディレクトリにアクセスしてそのファイルリストを取得できることを意味します。

これらの許可は通常、rwxr-xr-xのテキスト表現に変換されます。

または、ファイルでchmod +x file_nameを使用して実行可能にすることもできます。

37

KM Rakibul Islamの更新されたコードには、「no client found」(my_sessionは既に切り離されているため、tmuxがどのセッションを希望するかを理解できないため、切り離す)。正しいコードは次のとおりです。

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

teamocil を使用してこれを簡単に行うことができます。 YAMLファイルを作成するだけです:

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

「rubysession.yml」という名前を付けた場合、次を実行します。

teamocil rubysession

そして、それはあなたの目的のために完璧に機能し、ハックを必要としません。また、teamocilは他の多くの用途にも最適です!

3
Tom Anthony

いくつかのコマンドを開始した後に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などのシステム全体の初期化ファイルを読み取るためのものであるため、スクリプトでこれらを「ソース」にしたい場合があることに注意してください。

0
jeroent

これがまだあなたにとって興味深いかどうかはわかりませんが、答え/ヒントを提供したいと思います:たとえば、シェルスクリプトで複数の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

0
doc.aicdev

いくつかの実験で、シェルスクリプトを介して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.
0
Quang Van