系统开机时自动执行指令
使用 systemd
创建一个服务单元可以让系统开机时自动执行指令,假设需要执行的指令如下,运行可执行文件(/home/demo/可执行文件),并输入参数(–input=/home/config/demo.yaml):
/home/demo/可执行文件 --input=/home/config/demo.yaml
✅ 推荐方法:使用 systemd
1. 创建服务文件
以 root 权限创建一个新的服务文件,例如:
sudo nano /etc/systemd/system/demo.service
2. 编写服务内容
将以下内容粘贴进去(根据你的实际路径和用户名修改):
[Unit]
Description=demo
After=network.target[Service]
ExecStart=/usr/bin/taskset -c 0/home/demo/可执行文件 --input=/home/config/demo.yaml
Restart=always
User=yourusername
Environment="DISPLAY=:0"
StandardOutput=syslog
StandardError=syslog[Install]
WantedBy=multi-user.target
⚠️ 注意:
- 把
yourusername
替换为你运行这个程序的实际用户。 - 如果程序需要图形界面或访问 X11,请确保
Environment="DISPLAY=:0"
正确。 - 如果不需要 taskset,可以直接写成
ExecStart=/home/cpp/build/tennis_line --input=/home/config/lines.yaml
- 一般情况下只需要更改ExecStart和User
配置项 | 值 | 含义 |
---|---|---|
Description | Tennis Line Detection Service | 服务名称描述 |
After | network.target | 在网络就绪后启动 |
ExecStart | taskset -c 0 … | 实际执行的命令 |
Restart | always | 出现任何退出都重启 |
User | yourusername | 指定运行服务的用户 |
Environment | DISPLAY=:0 | 设置环境变量,用于图形界面,指定显示器 |
StandardOutput | syslog | 标准输出记录到 syslog |
StandardError | syslog | 错误输出也记录到 syslog |
WantedBy | multi-user.target | 在多用户模式下启动 |
3. 重新加载 systemd 配置
sudo systemctl daemon-reload
4. 启用服务开机自启
sudo systemctl enable tennis-line.service
5. 可选:立即启动服务
sudo systemctl start tennis-line.service
6. 查看日志确认是否运行正常
journalctl -u tennis-line.service
禁用开机自启
-
禁用服务
使用
systemctl disable
命令可以禁用指定的服务,使其不会在系统启动时自动启动。sudo systemctl disable demo.service
这个命令会移除
/etc/systemd/system/multi-user.target.wants/
目录下的相应符号链接(如果存在),从而达到禁止该服务随系统启动而启动的目的。 -
停止正在运行的服务(可选)
如果这个服务当前正在运行,并且想停止它,可以使用
systemctl stop
命令:sudo systemctl stop demo.service
-
确认服务已被禁用
可以通过查询服务的状态来确认它是否已经被正确禁用。禁用后,服务将不会随着系统的启动而自动启动,但仍然可以通过手动启动来运行。
sudo systemctl demo.service
在输出中,会看到类似“Loaded: loaded (…) disabled;”的信息,表示该服务已禁用。
删除服务文件(可选)
如果确定以后完全不需要这个服务了,也可以考虑删除相应的服务单元文件。请谨慎操作,因为这将永久删除该服务的所有配置。
sudo rm /etc/systemd/system/tennis-line.service
之后,别忘了重新加载 systemd 配置,以便更改生效:
sudo systemctl daemon-reload
完成以上步骤后, demo.service
就不会再在系统启动时自动启动了。