前言

前阵子,系统宕机,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
2
3
4
5
6
7
8
9
# 1.编辑rc.local文件
-bash-4.2$ vi /etc/rc.local

# 2.修改rc.local文件,在 exit 0 前面加入以下命令。保存并退出。
/nginx/nginx-1.22.0/sbin/nginx # nginx开机启动

# 3.最后修改rc.local文件的执行权限
-bash-4.2$ chmod +x /etc/rc.local
-bash-4.2$ chmod 755 /etc/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命令设置开机自启动

  1. 将(脚本)启动文件移动到 /etc/init.d/或者/etc/rc.d/init.d/目录下。(前者是后者的软连接)
1
-bash-4.2$ mv /nginx/nginx-start.sh /etc/rc.d/init.d
  1. 启动文件前面务必添加如下三行代码,否侧会提示chkconfig不支持。
1
2
3
4
#!/bin/sh             告诉系统使用的shell,所以的shell脚本都是这样
#chkconfig: 35 20 80 分别代表运行级别,启动优先权,关闭优先权,此行代码必须
#description: http server 自己随便发挥!!!,此行代码必须
/nginx/nginx-1.22.0/sbin/nginx
  1. 增加脚本的可执行权限
1
-bash-4.2$ chmod +x /etc/rc.d/init.d/nginx-start.sh
  1. 添加脚本到开机自动启动项目中。添加到chkconfig,开机自启动
1
2
3
-bash-4.2$ cd /etc/rc.d/init.d
-bash-4.2$ chkconfig --add nginx-start.sh
-bash-4.2$ chkconfig nginx-start.sh on
  1. 关闭开机启动
1
-bash-4.2$ chkconfig nginx-start.sh off
  1. 从chkconfig管理中删除nginx-start.sh
1
-bash-4.2$ chkconfig --del nginx-start.sh
  1. 查看chkconfig管理
1
-bash-4.2$ chkconfig --list nginx-start.sh

使用Systemd添加开机自启动服务

关于Systemd的详细信息,可以查看:Systemd Wikisystemd.service 官方手册systemd.service 中文手册,这部分内容摘自CSDN博主青椒^_^凤爪爪

使用方式

  1. 先放出我们的nginx自启动的服务,将这个服务命名为nginx.service
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=nginx service
After=network.target
[Service]
Type=forking
ExecStart=/nginx/nginx-1.22.0/sbin/nginx
ExecReload=/nginx/nginx-1.22.0/sbin/nginx -s reload
ExecStop=/nginx/nginx-1.22.0/sbin/nginx -s stop
Execenable=/nginx/nginx-1.22.0/sbin/nginx
User=nginx
Group=nginx
[Install]
WantedBy=multi-user.target
  1. nginx.service文件复制到 /etc/systemd/system/ 或者 /usr/lib/systemd/system/(如果在 /usr/lib/systemd/ 下没有system目录,则手动创建一个即可)

  2. 添加或修改配置文件后,需要重新加载,使用指令:sudo systemctl daemon-reload

  3. 设置允许自启动,使用指令: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] 小节
  1. Description=
      有利于人类阅读的、对单元进行简单描述的字符串。将被 systemd 或其他程序用来标记此单元,这个字符串应该只用于识别此单元即可,不需要过分说明。

  2. Wants=
      设置此单元所必须依赖的其他单元。当此单元被启动时,所有这里列出的其他单元只是尽可能被启动。 但是,即使某些单元不存在或者未能启动成功, 也不会影响此单元的启动。 推荐使用此选项来设置单元之间的依赖关系。

  3. Before=, After=
      强制指定单元之间的先后顺序,接受一个空格分隔的单元列表。不涉及依赖关系。

[Service] 小节
  1. Type=
      设置进程的启动类型。必须设为 simple, exec, forking, oneshot, dbus, notify, idle 之一。
      如果设为 simple, 那么 ExecStart= 字段启动的进程就是该服务的主进程, 并且 systemd 会认为在创建了该服务的主服务进程之后,该服务就已经启动完成。需要注意的是:对于 simple 类型的服务来说,即使不能成功调用主服务进程(例如 User=不存在、或者二进制可执行文件不存在), systemctl start 也仍然会执行成功。
      如果设为 forking ,那么表示 ExecStart= 进程将会在启动过程中使用 fork() 系统调用。systemd 会认为在父进程退出之后,该服务就已经启动完成。

  2. ExecStart=
      在启动该服务时需要执行的 “命令行(命令+参数)”,命令行必须以一个可执行文件(要么是绝对路径、要么是不含任何斜线的文件名)开始, 并且其后的那些参数将依次作为 “argv[1] argv[2] …” 传递给被执行的进程。

  3. Restart=
      当服务进程 正常退出、异常退出、被杀死、超时等情况的时候,是否或者如何重新启动该服务,可选的选项如下所示。

     no(默认值):退出后不会重启
     on-success:只有正常退出时,才会重启
     on-failure:非正常退出时,才会重启
     on-abnormal:只有被信号终止和超时,才会重启
     on-abort:只有在收到没有捕捉到的信号终止时,才会重启
     on-watchdog:超时退出,才会重启
     always:不管是什么退出原因,总是重启

  1. RestartSec=
      设置在重启服务(Restart=)前暂停多长时间。 默认值是100毫秒(100ms)。 如果未指定时间单位,那么将视为以秒为单位。 例如设为“20”等价于设为”20s”。

  2. KillMode=
      定义 Systemd 如何停止服务,可选的设置选项如下所示。

     control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
     process:只杀主进程
     mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
     none:没有进程会被杀掉,只是执行服务的 stop 命令

  1. User=、Group=:设置启动的用户、组

  2. WorkingDirectory=:设置服务的工作路径

  3. ExecReload=:重启服务时执行的命令

  4. ExecStop=:停止服务时执行的命令

  5. ExecStartPre=:启动服务之前执行的命令

  6. ExecStartPost=:启动服务之后执行的命令

  7. ExecStopPost=:停止服务之后执行的命令

[Install] 小节
  1. Alias=
      启用时使用的别名,可以设为一个空格分隔的别名列表。

  2. WantedBy=, RequiredBy=
      表示该服务所在的 Target(服务组),表示在使用 systemctl enable 启用此单元时,将会在每个列表单元的 .wants/ 或 .requires/ 目录中创建一个指向该单元文件的软连接