Shell-Script

啟動時無法觸發 tmux 腳本

  • January 6, 2019

我有一個如下所述的 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 Failedsudo 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 步

我在 中創建了一個子 shellrc.local擷取被觸發的腳本的任何活動

# 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

具有諷刺意味的是,如果我在我的Ubuntu 14.04 LTS筆記型電腦上執行這樣的步驟,腳本會通過我的rc.local文件觸發

更多選項

  1. 也許嘗試一個init.d/daemon-script 但不確定 anrc.local和 a是否crontab不能處理這個問題,那麼也許一個守護程序也不會
  2. 我不知道是否有~/.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 aOnce 附加會話時,將獲得一個帶有2 個視窗的 tmux 會話

  1. 最初的只是一個空會話,由於tmux new-session -d -s sess1
  2. 另一個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 執行腳本時使用,以防分離模式下的腳本出現故障

引用自:https://unix.stackexchange.com/questions/294466