现有的一些开机自动运行方法存在一些缺陷:
- 在.bashrc中添加运行命令会导致每次连接新的终端都会运行程序;同理,在/etc/profile.d/目录中存放sh脚本亦会如此;
- ubuntu16及以上版本中,已无 rc.local。
而本文所介绍的方法比较方便且没有以上问题。
一 、创建脚本
sudo vim /etc/systemd/system/xxx.service
xxx是你给自己服务自定义的名字。
文件内容如下:
[Unit]
Description=xxx
[Service]
Type=simple
PIDFile=/run/xxx.pid
ExecStart=/脚本路径/xxx.sh
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
[Install]
WantedBy=multi-user.target graphical.target
二、赋予要执行的脚本权限
chmod +x /脚本路径/xxx.sh
三、执行命令
# 修改service文件之后需要刷新Systemd
sudo systemctl daemon-reload
# 使xxx开机自启
sudo systemctl enable xxx
# 剩下的命令看需要使用
# 启动xxx
sudo service xxx start
# 重启xxx
sudo service xxx restart
# 停止xxx
sudo service xxx stop
# 查看xxx的运行状态
sudo service fsm status
# 查看程序的输出
journalctl -fu xxx
四、一些注意事项
1、一些脚本中的命令依赖于用户环境
例如,我有一个python程序需要在nju用户的conda环境中运行,那么在编写脚本的时候要直接指定绝对路径中的python,这样才能用那个环境来运行:
/home/nju/.conda/envs/yolo/bin/python xxx.py
此外,python程序中不少地方要用到相对路径,那么在运行py脚本的时候,建议先cd到py脚本所在目录,再运行,附上一个python程序自启动脚本的示例:
#! /bin/bash
cd /home/nju/battlefield/
/home/nju/.conda/envs/yolo/bin/python FSM.py