web-dev-qa-db-ja.com

起動時にtmuxスクリプトをトリガーできません

下記のように、Raspbian Wheezy 7.1で実行されているtmuxトリガースクリプトがあります。

  • ステップ1

    #!/bin/bash
    # this script is called "sess"
    
    tmux new-session -d -s sess1 'Sudo /home/pi/bin/myscript.py'
    exit 0
    

実行中のスクリプトを次のように確認しました。

  • 最初にpythonスクリプトSudo /home/pi/bin/myscript.pyを実行し、次に上記のtmux new-session -d -s sess1 'Sudo /home/pi/bin/myscript.py'のようにtmuxコマンドを入力します。両方の時間でスクリプトが実行されます。

ユーザーがこのスクリプトを入力して実行できる場合は、完全なものをbashスクリプトとして記述できると考えて間違いありません。したがって、上記のスクリプト「sess」

  • ステップ2

私はこのファイルにchmod +x /home/pi/bin/sessを介して実行権を与えました

  • ステップ3

また、次のようにrc.localを使用してスクリプトを実行しようとしました。

# in the rc.local file 

/home/pi/bin/sess &
exit 0

Piがアドホックネットワークに参加するために起動時に[〜#〜] wlan [〜#〜]パラメータを設定したため、rc.localファイルがファクトに対してトリガーされます。

Piにsshできるので、これを明確に確認できます。

観察:

再起動しても、スクリプトはトリガーされません。これは、tmux lsと書かれたConnection to Server Failedコマンドで確認できます。スーパーユーザーがtmuxセッションを持っているが、出力が同じである場合は、Sudo tmux lsを使用して確認しました。

  • ステップ4

以下を使用して、crontabでスクリプトを実行してみました。

Sudo crontab -u pi -e

## inside the crontab

@reboot /home/pi/bin/sess &

スーパーユーザー用にcronジョブも作成してみました

Sudo crontab -e

@reboot /home/pi/bin/sess &

観察:

再起動すると、スクリプトは実行されません。

  • ステップ5

トリガーされているスクリプトのアクティビティをキャプチャするために、rc.localsub-Shellを作成しました

# in the rc.local file
(/home/pi/bin/sess &) > /tmp/tmux.log

観察

再起動時にcat /tmp/tmux.logファイル内に何もありません。ファイルtmux.logは作成されますが

推論

皮肉なことに、ログイン中にSudo /etc/rc.localSudo ~/bin/sessのようなことをすると、実際にSudo tmux aを使用してセッションをアタッチでき、リストSudo tmux lsも表示できるため、スクリプトは完全にトリガーされます。

ただし、起動時に実行できないため、起動時にトリガーされない場合、目的は役に立ちません。

また、実際に$PATHが表示されている環境変数/home/pi/binも確認しました。

また、環境変数がソートされていない可能性があるため、すべてのスクリプトでtmuxへの完全なパスを使用してみました。しかし、運はありません

$ which tmux
$ /usr/bin/tmux

皮肉なことに、私のbuntu 14.04 LTSラップトップでこのような手順を実行すると、スクリプトはrc.localファイルを介してトリガーされます

その他のオプション

  1. init.d/デーモンスクリプトを試してみてください。ただし、rc.localcrontabがこれを処理できないかどうかわからない場合は、デーモンも処理できません。

  2. ~/.tmux.confが良いかどうかわかりません。

3
Shan-Desai

tmuxを使用してデタッチされたスクリプトをトラブルシューティングするための最も最適化されたソリューションでは、トリガースクリプト内で次のオプションを使用する必要があります。

#!/bin/bash
# this script is called "sess"

tmux new-session -d -s sess1

# this statement is a life-saver for tmux detached sessions
tmux set-option -t sess1 set-remain-on-exit on

# In my case running the script in a new window worked
tmux new-window -d -n 'nameofWindow' -t sess1:1 'Sudo /home/pi/bin/script.py'

exit 0

これで、次のスクリプトがrc.localから呼び出され、Piが再起動されました。 Sudo tmux aを使用してセッションをアタッチすると、最終的に再起動時に2ウィンドウでtmuxセッションを取得します

  1. 最初のセッションは、tmux new-session -d -s sess1が原因でトリガーされた空のセッションです。

  2. もう1つは、tmux new-windowコマンドからのものです。 CTRL+B1sess1:1注:ホットキーはユーザーによって異なる場合があるため、デフォルトのtmuxホットキー(バインドキー)は次のようになります。 CTRL+B

推論

スクリプトがエラーで終了した場合、ウィンドウにはエラーが発生した場所が表示されます。私の場合はPythonスクリプトでエラーが発生し、下部にはPane is Deadが表示されます。 =。したがって、スクリプトのエラーにより、tmuxセッションは、関連するログ(フィードバック)を提供せずに終了したため、上記の/tmp/tmux.logに出力は記録されませんでした。

したがって、デタッチモードのスクリプトに障害がある場合に備えて、tmuxでスクリプトを実行するときは、常にset-remain-on-exit onを使用することをお勧めします。

2
Shan-Desai