我有一个如下所述的 tmux 触发脚本,运行在树莓派 喘息 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
,然后输入多路复用器命令如上所述tmux 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 加入 Ad-Hoc 网络。
我可以清楚地验证这一点,因为我可以
ssh
进入我的 Pi。
观察结果:
重新启动后,不会触发脚本。这可以通过tmux ls
以下命令进行验证Connection to Server Failed
。我还使用 incase 验证了sudo tmux ls
超级用户是否具有 tmux 会话,但输出是相同的。
- 步骤4
我尝试使用以下命令运行脚本crontab
:
sudo crontab -u pi -e
## inside the crontab
@reboot /home/pi/bin/sess &
我也尝试创建一个计划任务对于超级用户
sudo crontab -e
@reboot /home/pi/bin/sess &
观察结果:
重新启动后,该脚本不会执行。
- 步骤5
我创建了一个子壳捕获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/
守护进程脚本,但不确定 anrc.local
和 acrontab
是否无法处理这个问题,那么也许守护进程也不会我不知道 a 是否
~/.tmux.conf
有好处。
答案1
使用最优化的解决方案对任何分离的脚本进行故障排除多路复用器将要求您在触发脚本中使用以下选项:
#!/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 已重新启动。最终在重新启动时,当您使用 Once 附加会话时sudo tmux a
获取 tmux 会话2 个窗户
最初的会话只是由于以下原因触发的空会话
tmux new-session -d -s sess1
另一个来自
tmux new-window
命令,可以使用CTRL+ B+打开1,因为它被提到为sess1:1
(笔记:热键可能因用户而异,默认的 tmux 热键(绑定键)是CTRL+ B)
推理
如果脚本以错误结束,窗口将显示错误所在的位置(在我的例子中,Python 脚本中的错误),并在底部显示窗格已死。因此,由于脚本中的错误多路复用器会话退出时没有给出任何相关日志(反馈),因此上述内容中没有记录任何输出/tmp/tmux.log
因此,始终建议在使用set-remain-on-exit on
tmux 运行脚本时使用 ,以防分离模式下的脚本出现错误