下記のように、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
実行中のスクリプトを次のように確認しました。
Sudo /home/pi/bin/myscript.py
を実行し、次に上記のtmux new-session -d -s sess1 'Sudo /home/pi/bin/myscript.py'
のようにtmuxコマンドを入力します。両方の時間でスクリプトが実行されます。ユーザーがこのスクリプトを入力して実行できる場合は、完全なものをbashスクリプトとして記述できると考えて間違いありません。したがって、上記のスクリプト「sess」
私はこのファイルにchmod +x /home/pi/bin/sess
を介して実行権を与えました
また、次のように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
を使用して確認しました。
以下を使用して、crontab
でスクリプトを実行してみました。
Sudo crontab -u pi -e
## inside the crontab
@reboot /home/pi/bin/sess &
スーパーユーザー用にcronジョブも作成してみました
Sudo crontab -e
@reboot /home/pi/bin/sess &
再起動すると、スクリプトは実行されません。
トリガーされているスクリプトのアクティビティをキャプチャするために、rc.local
にsub-Shellを作成しました
# in the rc.local file
(/home/pi/bin/sess &) > /tmp/tmux.log
再起動時にcat /tmp/tmux.log
ファイル内に何もありません。ファイルtmux.log
は作成されますが
皮肉なことに、ログイン中にSudo /etc/rc.local
やSudo ~/bin/sess
のようなことをすると、実際にSudo tmux a
を使用してセッションをアタッチでき、リストSudo tmux ls
も表示できるため、スクリプトは完全にトリガーされます。
ただし、起動時に実行できないため、起動時にトリガーされない場合、目的は役に立ちません。
また、実際に$PATH
が表示されている環境変数/home/pi/bin
も確認しました。
また、環境変数がソートされていない可能性があるため、すべてのスクリプトでtmuxへの完全なパスを使用してみました。しかし、運はありません
$ which tmux
$ /usr/bin/tmux
皮肉なことに、私のbuntu 14.04 LTSラップトップでこのような手順を実行すると、スクリプトは
rc.local
ファイルを介してトリガーされます
init.d/
デーモンスクリプトを試してみてください。ただし、rc.local
とcrontab
がこれを処理できないかどうかわからない場合は、デーモンも処理できません。
~/.tmux.conf
が良いかどうかわかりません。
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セッションを取得します
最初のセッションは、tmux new-session -d -s sess1
が原因でトリガーされた空のセッションです。
もう1つは、tmux new-window
コマンドからのものです。 CTRL+B + 1sess1:1
(注:ホットキーはユーザーによって異なる場合があるため、デフォルトのtmuxホットキー(バインドキー)は次のようになります。 CTRL+B)
スクリプトがエラーで終了した場合、ウィンドウにはエラーが発生した場所が表示されます。私の場合はPythonスクリプトでエラーが発生し、下部にはPane is Deadが表示されます。 =。したがって、スクリプトのエラーにより、tmuxセッションは、関連するログ(フィードバック)を提供せずに終了したため、上記の/tmp/tmux.log
に出力は記録されませんでした。
したがって、デタッチモードのスクリプトに障害がある場合に備えて、tmuxでスクリプトを実行するときは、常にset-remain-on-exit on
を使用することをお勧めします。