项目中,需求希望当开发板上Ubuntu一跑起来,项目和其他基础服务一并跑起来。所以需要通过添加自启动任务。
以运行一条命令为例,未添加自启动时,通过python3 test.py
运行一个python服务。现在需要开机自启。
注意,如下步骤需要在root权限下执行,可以先行切换,或者sudo。
自定义自启服务脚本
Ubuntu18.x中,在“ /lib/systemd/system”路径下,新建一个service,如
cd /lib/systemd/system vim test.service
内容大致如下:
[Unit] Description=video_capture_moving service # 需要当nginx_rtmp.service 服务执行完后,再执行当前服务 After=nginx_rtmp.service [Service] # 指定ExecStart命令执行(服务运行)的所在目录 WorkingDirectory=/root/ss/ # 需要自启的命令(服务) ExecStart=/usr/bin/python3 /root/ss/test.py Restart=on-failure RestartSec=50s ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s TERM $MAINPID [Install] WantedBy=multi-user.target
有几个参数着重强调下,这里我需要这个自定义的test.service在某个服务运行后,再执行,则配置After参数。
test.py中需要需要某些资源在“/root/ss”中,如需要读取“/root/ss”下的一个文件,但是代码中是使用的相对路径“./”,那么如果不配置WorkingDirectory参数,那么运行test.py时就会异常,加载不到所需资源。
ExecStart配置需要运行的shell命令,必须写完整路径,如我的python3在“/usr/bin”下(which python3
),那么就必须指明/usr/bin/python3,否则service启动时,会报“Executable path is not absolute”类似错误。这是因为 Ubuntu Systemd需要完整路径,因为它不像您使用终端时那样使用shell。
具体其他脚本参数,这里不一一赘述,可参考:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
自定义服务脚本后,需要让系统重新加载配置
systemctl daemon-reload
然后设置开机自启
systemctl enable test.service
然后重新启动系统
reboot
为了便于测试,可以直接在自定义服务脚本完成后,就启动服务
systemctl start test.service
然后查看服务运行状态
systemctl status test.service
运行成功如下:
service貌似在早先的版本上是支持的,这也是Ubuntu早先的设计,在后续版本中,逐步被systemctl所替代。所以通过service完成自启动内容,可能不可行,最好通过systemctl完成。
发表评论