我想在启动时在 byobu/tmux 会话中启动一个 python 脚本(如果会话不存在则创建该会话),以便稍后可以附加到它。
我创建了一个包含以下命令的 start_script.sh :
byobu-tmux new-session -A -s userscript \; rename-window userscript1 \; send-keys "cd /home/username/scripts/ && python userscript1.py" C-m
手动执行时效果很好。然后我创建了一个systemd服务文件
[Unit]
Description=Sensors service
After=multi-user.target
StartLimitIntervalSec=0
[Service]
Type=forking
User=username
ExecStart=/bin/bash /home/username/start_script.sh
RemainAfterExit=yes
[Install]
WantedBy=default.target
但是,服务失败并显示
Jun 21 17:11:39 hostname bash[15061]: open terminal failed: not a terminal
我还尝试将 start_script 命令放在执行开始=,但是启动服务失败并显示相同的错误消息(只是byobut-tmux作为命令名称而不是巴什)。
理想情况下,我希望将 python 进程作为服务由 systemd 处理,这样它就会在失败时自动重新启动,但这不是必需的。
答案1
这是最终对我有用的东西(在 Ubuntu 18.04 上)。
/home/username/start_script.sh
(不要忘记该文件chmod +x
的 ):
#!/bin/bash
set -x
set -e
byobu list-sessions | grep my-app || byobu new-session -d -s my-app
byobu list-windows -t my-app | grep start-script || byobu new-window -t my-app -n 'start-script'
byobu send-keys -t my-app:start-script "cd /home/username/scripts/ && python userscript1.py" C-m
还有/etc/systemd/system/my-app.start_script.service
:
[Unit]
Description=My app start script
[Service]
Type=forking
ExecStart=/bin/bash -l -c '/home/username/start_script.sh'
User=username
Group=usergroupname
[Install]
WantedBy=multi-user.target
然后安装它,感谢sudo systemctl enable my-app.start_script.service
.
要查看服务的日志:sudo journalctl -u my-app.start_script.service
。
答案2
您的脚本中的第一行是否有 #/bin/bash ?不确定这是否可以解决问题,但这样您就可以在 ExecStart 条目上调用脚本。