前言
Linux下,可能需要在某些场景下自动去执行一些命令,比如开机启动。本次分享包含,开机启动脚本,程序,以及相关配置命令。开机启动方法也很多,但针对的条件也不同。
desktop开机自启
通过编写desktop文件,将文件放到/etc/xdg/autostart/目录下,则可开机启动相应程序。其中”Exec=/usr/bin/showTime“,/usr/bin/showTime就是你要执行的程序,这里可以是界面程序,也可以是脚本。
将该desktop文件,添加可执行权限后放到桌面,也可直接执行。
desktop文件例子:
kch@kch:~/showTime/show-timer-1.0.0$ cat showTime.desktop
[Desktop Entry]
Name=showTimer
Icon=/usr/share/time-weather.png
Exec=/usr/bin/showTime
Terminal=false
Type=Application
NoDisplay=false
kch@kch:~/showTime/show-timer-1.0.0$
desktop文件参数介绍
service服务开机自启
通过编写service服务的方式启动,但只能启动非界面程序。将service文件放到/lib/systemd/system/目录下,然后执行systemctl enable xxx.service ,/lib/systemd/system/目录下的xxx.service 符号链接会放在 /etc/system/sytemd 下,然后会开机启动该服务。
service参数介绍
[Unit] 是启动顺序和依赖关系,如果有Wants或Requires字段代表依赖关系
[Service] 是启动的行为
[install] 是如何安装这个配置文件
[Unit]
Description=xxxx
After=network.target remote-fs.target nss-lookup.target #启动顺序 在这些程序之后启动
Wants=network.target #弱依赖,启动失败或停止运行,不影响xxxx本服务继续执行
#Requires=nss-lookup.target 强依赖,即如果nss-lookup.target服务启动失败或异常退出,那么本服务也必须退出。
[Service]
Type=notify
ExecStart=/usr/bin/xxx #启动进程时执行的命令
RemainAfterExit=yes #表示进程退出以后,服务仍然保持执
[Install]
WantedBy=multi-user.target #表示服务所在的Target(服务组)
当然还有其他配置参数
[Service] 区块 EnvironmentFile字段
指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取。
[Service] 区块 ExecStart字段
定义启动进程时执行的命令,也是配置文件里面最重要的字段。
- ExecReload字段:重启服务时执行的命令
- ExecStop字段:停止服务时执行的命令
- ExecStartPre字段:启动服务之前执行的命令
- ExecStartPost字段:启动服务之后执行的命令
- ExecStopPost字段:停止服务之后执行的命令
[Service] 区块 Type字段 启动类型
可选值:
- simple(默认值):ExecStart字段启动的进程为主进程
- forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
- oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
- dbus:类似于simple,但会等待 D-Bus 信号后启动
- notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
- idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合
[Service] 区块 KillMode字段 重启行为
可选值:
- control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
- process:只杀主进程
- mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
- none:没有进程会被杀掉,只是执行服务的 stop 命令。
[Service] 区块 Restart字段
定义了该服务退出后,Systemd 的重启方式
- no(默认值):退出后不会重启
- on-success:只有正常退出时(退出状态码为0),才会重启
- on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
- on-abnormal:只有被信号终止和超时,才会重启
- on-abort:只有在收到没有捕捉到的信号终止时,才会重启
- on-watchdog:超时退出,才会重启
- always:不管是什么退出原因,总是重启
[Service] 区块 RestartSec字段
表示 Systemd 重启服务之前,需要等待的秒数。
[Install] 区块
Install区块,定义如何安装这个配置文件,即怎样做到开机启动
[Install] 区块 WantedBy字段
表示该服务所在的 Target,Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,默认的启动 Target 是multi-user.target。
这个设置非常重要,因为执行systemctl enable xxx.service命令时,xxx.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中,在这个组里的所有服务,都将开机启动。
systemctl常用命令
列出正在运行的 Unit
$ systemctl list-units
# 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all
# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive
# 列出所有加载失败的 Unit
$ systemctl list-units --failed
# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service
# 显示系统状态
$ systemctl status
# 显示单个 Unit 的状态
$ sysystemctl status xxx.service
# 立即启动一个服务
$ sudo systemctl start apache.service
# 立即停止一个服务
$ sudo systemctl stop apache.service
# 重启一个服务
$ sudo systemctl restart apache.service
# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
#设置开机启动该服务
$ sudo systemctl enable xxx.service
# 等同于
$ sudo ln -s '/lib/systemd/system/xxx.service'
'/etc/systemd/system/multi-user.target.wants/xxx.service'
#撤销符号链接关系
$ sudo systemctl disable xxx.service
其他脚本自动启动
还有几种系统配置自启动脚本的方式。其原理是,执行脚本加入相关配置文件中,在用户登录时会读取配置文件,从而执行相关脚本。
每个文件执行时机不同
/etc/profile:系统配置文件,用户登录时读取一次
/etc/bash.bashrc:系统配置文件 ,用户登录时读取一次,每次打开一个新终端会话时读取一次
~/.profile(~/.bash_profile、~/.bash_login):用户配置文件,用户登录时读取一次
~/.bashrc:用户配置文件,用户登录时读取一次,每次打开一个新终端会话时读取一次
需要注意的是:
- 1、它只对 bash 有效
- 2、系统配置文件作用于全局,而用户配置文件仅针对当前登录的用户
- 3、先读取系统配置文件,再读取用户配置文件,用户配置文件的变量和表达式等都继承自系统配置文件