linux systemctl命令添加开机启动脚本

linux systemctl命令添加开机启动脚本
我想开机自动运行 sudo chmod 777 /dev/ttyTHS1命令来启动串口
systemctl命令添加开机启动可以直接写命令,也可以写脚本,我这里主要写个脚本

//首先使用sudo 命令创建一个.sh文件
$ vim openttyTHS1.sh

下面是写在.sh文件中的脚本命令,#!/bin/bash 是写.sh脚本必须添加的,否则会报错

一定要在linux下创建.sh文件!!!!

#!/bin/bash
sudo chmod 777 /dev/ttyTHS1

然后赋予脚本执行权限

$ chmod +x openttyTHS1.sh

接下来要到**/etc/systemd/system/** 创建systemctl文件,后缀为.service

//首先使用sudo 命令创建一个.service文件
$ vim openttyTHS1.service
[Unit]
Description=JetBot start service
After=multi-user.target

[Service]
Type=oneshot
User=root
ExecStart=/usr/bin/openttyTHS1.sh
WorkingDirectory=/home/jetbot

[Install]
WantedBy=multi-user.target
~                                           

一定要注意User=root否则会报sudo以后没有密码之类的错误
然后命令

sudo systemctl enable openttyTHS1
sudo systemctl start openttyTHS1

这样就完成开机启动了,可以重启试试

如果需要查看已有的服务,可以使用:
sudo systemctl list-units

如果有些服务文件,虽然已经在服务文件的目录下,但是它不是热生效的,即不是说咱们把它放进去就能被识别、注册、启动的。它没有被 systemctl 的 start 或 enable 命令登记到Systemd,如果你需要的话,得自己做这个操作。
如果想查看没被激活的服务文件怎么办呢?
sudo systemctl list-unit-files

言归正传,第三四行的rm操作就是干掉这个文件,如果我们修改了一个服务文件,可是Systemd不知道,因为它缓存了一份服务,所以需要重新载入,否则它还是使用旧的。这个行为类似于service nginx reload,在这里是:
sudo systemctl daemon-reload

最后,如果是删除服务文件的话,又不一样了,即使我们reload,Systemd已然可以使用自己缓存的服务文件,哪怕你用了daemon-reload更新。所以这时候要告诉Systemd,我们已经放弃不存在的服务文件了,让它也放弃自己缓存的那份:
systemctl reset-failed

1.[Unit]
主要是对这个服务的说明,内容, 文档介绍以及对一些依赖服务定义
Description 服务描述,作为systemctl status 命令输出的一个介绍
Documentation 一个url 定义服务的具体介绍网址
After 在什么服务启动之后
Before 在什么服务启动之前启动
Requires 依赖其他的单元服务, 需要与列出的服务一起激活,若任何服务无法启动,则该单元不会被激活
Wants 比Requires依赖性弱,弱其他服务没有启动成功,该服务也不受影响,只是表示一种推荐

2.[Service]
服务的主体定义,主要定义服务的一些运行参数,及操作动作
Type
1.simple默认参数,进程作为主进程
2.forking是后台运行的形式,主进程退出,os接管子进程
3.oneshot 类似simple,在开始后续单元之前,过程退出
4.DBUS 类似simple,但随后的单元只在主进程获得D总线名称之后才启动
5.notify 类似simple,但是随后的单元仅在通过sd_notify()函数发送通知消息之后才启动
6.idle类似simple,服务二进制文件的实际执行被延迟到所有作业完成为止,不与其他服务的输出相混合,如状态输出与服务的shell输出混合

3.[Install]
服务安装的相关设置,一般可设置为多用户的

其他更为详细的sysytemctl操作请参考
阮一峰的网络日志——Systemd 入门教程:实战篇

你可能感兴趣的:(linux,bash,运维)