前言
前阵子,系统宕机,nginx没有自启动,导致系统报警,也幸好系统报警了,如果没有系统报警,那么这个问题由用户使用的时候在被发现,就变成事故了,所以决定把nginx加到linux的开机自启动,其实吧,这个网上一搜一大把,但是呢,大部分都没有讲,如何指定用户启动,基本上都是以root用户自启动的,我查了好久资料,终于找到了如何以nginx用户来启动nginx,所以准备顺手写一个日志记录一下
将启动命令写到系统开机的启动文件中
系统启动时会加载一下配置文件:
/etc/profile、/root/.bash_profile
/etc/bashrc、/root/.bashrc
/etc/profile.d/*.sh、/etc/profile.d/lang.sh
/etc/sysconfig/i18n、/etc/rc.local(/etc/rc.d/rc.local)
可以通过修改文件 /etc/rc.local(或者/etc/rc.d/rc.local),在配置文件中增加开机启动命令:
1 | 1.编辑rc.local文件 |
也可以将(脚本)启动文件移动到 /etc/init.d/或者/etc/rc.d/init.d/目录下。(前者是后者的软连接):
1 | -bash-4.2$ mv /nginx/nginx-start.sh /etc/rc.d/init.d |
通过chkconfig命令设置开机自启动
- 将(脚本)启动文件移动到 /etc/init.d/或者/etc/rc.d/init.d/目录下。(前者是后者的软连接)
1 | -bash-4.2$ mv /nginx/nginx-start.sh /etc/rc.d/init.d |
- 启动文件前面务必添加如下三行代码,否侧会提示chkconfig不支持。
1 | !/bin/sh 告诉系统使用的shell,所以的shell脚本都是这样 |
- 增加脚本的可执行权限
1 | -bash-4.2$ chmod +x /etc/rc.d/init.d/nginx-start.sh |
- 添加脚本到开机自动启动项目中。添加到chkconfig,开机自启动
1 | -bash-4.2$ cd /etc/rc.d/init.d |
- 关闭开机启动
1 | -bash-4.2$ chkconfig nginx-start.sh off |
- 从chkconfig管理中删除nginx-start.sh
1 | -bash-4.2$ chkconfig --del nginx-start.sh |
- 查看chkconfig管理
1 | -bash-4.2$ chkconfig --list nginx-start.sh |
使用Systemd添加开机自启动服务
关于Systemd的详细信息,可以查看:Systemd Wiki 、 systemd.service 官方手册 、 systemd.service 中文手册,这部分内容摘自CSDN博主青椒^_^凤爪爪
使用方式
- 先放出我们的nginx自启动的服务,将这个服务命名为
nginx.service
1 | [Unit] |
将
nginx.service
文件复制到 /etc/systemd/system/ 或者 /usr/lib/systemd/system/(如果在 /usr/lib/systemd/ 下没有system目录,则手动创建一个即可)添加或修改配置文件后,需要重新加载,使用指令:sudo systemctl daemon-reload
设置允许自启动,使用指令:sudo systemctl enable nginx.service(后缀.service可以省略)
常用命令
启动:
sudo systemctl start nginx.service
激活开机启动:sudo systemctl enable nginx.service
取消开机启动:sudo systemctl disable nginx.service
启动服务:sudo systemctl start nginx.service
停止服务:sudo systemctl stop nginx.service
重启服务:sudo systemctl restart nginx.service
重载服务:sudo systemctl daemon-reload
察看运行情况:sudo systemctl status nginx.service
查看所有已启动的服务:sudo systemctl list-units --type=service
配置文件说明
在system目录下,每个服务文件以 .service 结尾, 封装了一个被 systemd 监视与控制的进程。一般文件内容会分为 3个 小节,分别为:
- [Unit] 小节:此区块为启动顺序与依赖关系的描述,包含与单元类型无关的通用信息
- [Service] 小节:描述启动行为,定义如何启动此服务,此部分不可省略
- [Install] 小节:包含单元的启用信息,定义如何安装配置文件,只有 enable 与 disable 命令在启用/停用单元时才会使用此小节
[Unit] 小节
Description=
有利于人类阅读的、对单元进行简单描述的字符串。将被 systemd 或其他程序用来标记此单元,这个字符串应该只用于识别此单元即可,不需要过分说明。Wants=
设置此单元所必须依赖的其他单元。当此单元被启动时,所有这里列出的其他单元只是尽可能被启动。 但是,即使某些单元不存在或者未能启动成功, 也不会影响此单元的启动。 推荐使用此选项来设置单元之间的依赖关系。Before=, After=
强制指定单元之间的先后顺序,接受一个空格分隔的单元列表。不涉及依赖关系。
[Service] 小节
Type=
设置进程的启动类型。必须设为 simple, exec, forking, oneshot, dbus, notify, idle 之一。
如果设为 simple, 那么 ExecStart= 字段启动的进程就是该服务的主进程, 并且 systemd 会认为在创建了该服务的主服务进程之后,该服务就已经启动完成。需要注意的是:对于 simple 类型的服务来说,即使不能成功调用主服务进程(例如 User=不存在、或者二进制可执行文件不存在), systemctl start 也仍然会执行成功。
如果设为 forking ,那么表示 ExecStart= 进程将会在启动过程中使用 fork() 系统调用。systemd 会认为在父进程退出之后,该服务就已经启动完成。ExecStart=
在启动该服务时需要执行的 “命令行(命令+参数)”,命令行必须以一个可执行文件(要么是绝对路径、要么是不含任何斜线的文件名)开始, 并且其后的那些参数将依次作为 “argv[1] argv[2] …” 传递给被执行的进程。Restart=
当服务进程 正常退出、异常退出、被杀死、超时等情况的时候,是否或者如何重新启动该服务,可选的选项如下所示。
no(默认值):退出后不会重启
on-success:只有正常退出时,才会重启
on-failure:非正常退出时,才会重启
on-abnormal:只有被信号终止和超时,才会重启
on-abort:只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog:超时退出,才会重启
always:不管是什么退出原因,总是重启
RestartSec=
设置在重启服务(Restart=)前暂停多长时间。 默认值是100毫秒(100ms)。 如果未指定时间单位,那么将视为以秒为单位。 例如设为“20”等价于设为”20s”。KillMode=
定义 Systemd 如何停止服务,可选的设置选项如下所示。
control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
process:只杀主进程
mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none:没有进程会被杀掉,只是执行服务的 stop 命令
User=、Group=:设置启动的用户、组
WorkingDirectory=:设置服务的工作路径
ExecReload=:重启服务时执行的命令
ExecStop=:停止服务时执行的命令
ExecStartPre=:启动服务之前执行的命令
ExecStartPost=:启动服务之后执行的命令
ExecStopPost=:停止服务之后执行的命令
[Install] 小节
Alias=
启用时使用的别名,可以设为一个空格分隔的别名列表。WantedBy=, RequiredBy=
表示该服务所在的 Target(服务组),表示在使用 systemctl enable 启用此单元时,将会在每个列表单元的 .wants/ 或 .requires/ 目录中创建一个指向该单元文件的软连接