无法在启动时触发 tmux 脚本

无法在启动时触发 tmux 脚本

我有一个如下所述的 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.localsudo ~/bin/sess当我登录时脚本会被完美触发,因为我实际上可以使用附加会话sudo tmux a并查看列表sudo tmux ls

但由于它无法在启动时运行,如果不在启动时触发,其目的就毫无用处。

$PATH我还检查了实际显示的环境变量/home/pi/bin

我还尝试在所有脚本中使用 tmux 的完整路径,因为环境变量可能无法排序。但没有运气

$ which tmux
$ /usr/bin/tmux

具有讽刺意味的是,如果我按照我的Ubuntu 14.04 LTSrc.local笔记本电脑脚本通过我的文件触发

更多选择

  1. 也许尝试一个init.d/守护进程脚本,但不确定 anrc.local和 acrontab是否无法处理这个问题,那么也许守护进程也不会

  2. 我不知道 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 个窗户

  1. 最初的会话只是由于以下原因触发的空会话tmux new-session -d -s sess1

  2. 另一个来自tmux new-window命令,可以使用CTRL+ B+打开1,因为它被提到为sess1:1(笔记:热键可能因用户而异,默认的 tmux 热键(绑定键)是CTRL+ B

推理

如果脚本以错误结束,窗口将显示错误所在的位置(在我的例子中,Python 脚本中的错误),并在底部显示窗格已死。因此,由于脚本中的错误多路复用器会话退出时没有给出任何相关日志(反馈),因此上述内容中没有记录任何输出/tmp/tmux.log

因此,始终建议在使用set-remain-on-exit ontmux 运行脚本时使用 ,以防分离模式下的脚本出现错误

相关内容