啟動時無法觸發 tmux 腳本
我有一個如下所述的 tmux 觸發腳本,在Raspbian Wheezy 7.10上執行:
- 第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
,然後鍵入上面提到的tmuxtmux new-session -d -s sess1 'sudo /home/pi/bin/myscript.py'
命令。腳本執行的兩次。因為如果使用者可以鍵入並執行此腳本,則可以安全地假設完整的東西可以編寫為 bash 腳本。因此上面提到的腳本’sess'
- 第2步
我已經通過
chmod +x /home/pi/bin/sess
- 第 3 步
我還嘗試使用
rc.local
以下方式執行腳本:# in the rc.local file /home/pi/bin/sess & exit 0
rc.local
由於我在啟動時為我的 Pi 設置了WLAN參數以加入 Ad-Hoc 網路,因此該文件被觸發。我可以清楚地驗證這一點,因為我可以
ssh
進入我的 Pi。觀察:
重新啟動後,不會觸發腳本。這可以通過顯示的
tmux ls
命令來驗證Connection to Server Failed
。sudo tmux ls
如果超級使用者有 tmux 會話但輸出相同,我還使用 incase 進行了驗證。
- 第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 步
我在 中創建了一個子 shell來
rc.local
擷取被觸發的腳本的任何活動# 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
具有諷刺意味的是,如果我在我的Ubuntu 14.04 LTS筆記型電腦上執行這樣的步驟,腳本會通過我的
rc.local
文件觸發更多選項
- 也許嘗試一個
init.d/
daemon-script 但不確定 anrc.local
和 a是否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
Once 附加會話時,將獲得一個帶有2 個視窗的 tmux 會話
- 最初的只是一個空會話,由於
tmux new-session -d -s sess1
- 另一個
tmux new-window
命令可以使用CTRL
++打開,因為它被提到為(*注意:*熱鍵可能因使用者而異,預設的 tmux 熱鍵(bindkeys)是B
+ )1``sess1:1``CTRL``B
推理
如果腳本以錯誤結束,視窗將顯示錯誤在我的 Python 腳本中的錯誤位置,並在底部顯示Pane is Dead。因此,由於腳本中的錯誤,退出了tmux會話而沒有給出任何相關的日誌(回饋),因此上述沒有記錄輸出
/tmp/tmux.log
因此,始終建議在
set-remain-on-exit on
使用 tmux 執行腳本時使用,以防分離模式下的腳本出現故障