摘要: 以往的服务通常使用 supervisord 或者 crontab 的方式来守护或者定时执行, 最近遇到了自己写的服务所依赖到一些组件服务, 在开机的没有自动启动的问题, 所以这次对添加 Linux 开机自启动的一些方式做一个总结. 让自己的服务可以做到无人托管开机自启动, 减少运营成本的同时可以防止有人偷偷写入开机启动项, 启动一些没有必要的服务.
用户自定义开机程序 (/etc/rc.d/rc.local)
rc.local
这些就是开机的时候会自动执行的脚本和命令了.
这个时候就有人问了, 我以前写的是 / etc/rc.local 这个文件也没写过你说的 / etc/rc.d/rc.local 文件啊. 这是因为 / etc/rc.local 软链接到 / etc/rc.d/rc.local, 所以写到哪个文件里都是一样的
写在这个文件里的开机脚本都是默认后台执行的, 不需要再加 & 符号了
自写脚本登陆自动执行 (/etc/profile.d/), 不是开机自动执行
/etc/profile.d
目录中存放的是一些应用程序所需的启动脚本, 其中包括了颜色, 语言, Less,VIM 及 which 等命令的一些附加设置.
当一个用户登录 Linux 系统或使用 su - 命令切换到另一个用户时, 也就是 Login shell 启动时, 首先要确保执行的启动脚本就是 /etc/profile .(只有 Login shell 启动时才会运行 /etc/profile 这个脚本, 也就是需要输入账号和密码的时候, 而 Non-login shell 不会调用这个脚本)
这些脚本文件之所以能够 被自动执行, 是因为在 / etc/profile 中使用一个 for 循环语句来调用这些脚本. 而这些脚本文件是用来设置一些变量和运行一些初始化过程的.
chkconfig 命令设置 可设置优先级别
/etc/rc.d/init.d 目录
为什么要介绍 / etc/rc.local/init.d 目录是因为要使用 chkconfig 来管理自动启动的脚本, 首先将启动文件 cp 到 /etc/init.d / 或者 / etc/rc.d/init.d/(前者是后者的软连接) 下才可以
- [root@VM_0_15_centos init.d]# ls
- abrt-ccpp atd cloud-config crond iptables lvm2-lvmetad netconsole ntpd psacct restorecond single
- abrtd auditd cloud-final functions irqbalance lvm2-monitor netfs ntpdate quota_nld rsyslog sshd
- abrt-oops blk-availability cloud-init halt kdump mdmonitor network postfix rdisc sandbox udev-post
- acpid bootlocal cloud-init-local ip6tables killall messagebus nfs-rdma pptpd rdma saslauthd YDService
- [root@VM_0_15_centos init.d]# cp pptpd pptpd2
- [root@VM_0_15_centos init.d]# service pptpd2 status
- pptpd (pid 1324) is running...
- [root@VM_0_15_centos init.d]# /etc/rc.d/init.d/pptpd2 status
- pptpd (pid 1324) is running...
此目录下的脚本会被提供给 service 或者 systemctl 使用
一般存在以下命令
start,stop,reload,restart,force-reload
大多数的情况下, 你会使用到 start,stop,restart 选项
当然了要使用 init.d 目录下的脚本, 你需要有 root 权限或 sudo 权限. 每个脚本都将被作为一个命令运行, 每个脚本也至少需要 755 权限.
/etc/init.d 指向 / etc/rc.d/init.d 目录
chkconfig
如何添加一个服务
增加服务的步骤:
服务脚本必须存放在 / etc/INI.d / 目录下;
chkconfig --add servicename
在 chkconfig 工具服务列表中增加此服务, 此时服务会被在 / etc/rc.d/rcN.d 中赋予 K/S 入口了;
chkconfig --level 35 mysqld on
修改服务的默认启动等级.
- [root@VM_0_15_centos init.d]# VIM pptpd
- #!/bin/sh
- #
- # Startup script for pptpd
- #
- # chkconfig: - 85 15
- # description: PPTP server
- # processname: pptpd
- # config: /etc/pptpd.conf
脚本文件前面务必添加如下三行代码, 否侧会提示 chkconfig 不支持
- #!/bin/sh 告诉系统使用的 shell, 所以的 shell 脚本都是这样
- #chkconfig: 35 20 80 分别代表运行级别, 启动优先权, 关闭优先权, 此行代码必须
- #description: http server(自己随便发挥) 此行代码必须
chkconfig --add 脚本文件名 操作后就已经添加了
使用范例:
- chkconfig --list #列出所有的系统服务
- chkconfig --add httpd #增加 httpd 服务
- chkconfig --del httpd #删除 httpd 服务
- chkconfig --level httpd 2345 on #设置 httpd 在运行级别为 2,3,4,5 的情况下都是 on(开启) 的状态
- chkconfig --list #列出系统所有的服务启动情况
- chkconfig --list mysqld #列出 mysqld 服务设置情况
- chkconfig --level 35 mysqld on #设定 mysqld 在等级 3 和 5 为开机运行服务,--level 35 表示操作只在等级 3 和 5 执行, on 表示启动, off 表示关闭
- chkconfig mysqld on #设定 mysqld 在各等级为 on,"各等级" 包括 2,3,4,5 等级
运行级别
代表是何等级时可以在开机时自动运行此服务
运行级别 0: 系统停机状态, 系统默认运行级别不能设为 0, 否则不能正常启动
运行级别 1: 单用户工作状态, root 权限, 用于系统维护, 禁止远程登陆
运行级别 2: 多用户状态 (没有联网 NFS)
运行级别 3: 完全的多用户状态 (有联网 NFS), 登陆后进入控制台命令行模式
运行级别 4: 系统未使用, 保留
运行级别 5:X11 控制台, 登陆后进入图形 GUI 模式
运行级别 6: 系统正常关闭并重启, 默认运行级别不能设为 6, 否则不能正常启动
需要说明的是, level 选项可以指定要查看的运行级而不一定是当前运行级. 对于每个运行级, 只能有一个启动脚本或者停止脚本. 当切换运行级时, init 不会重新启动已经启动的服务, 也不会再次去停止已经停止的服务.
如果默认情况下, 服务不应在任何运行级别中启动, 则应使用 - 代替运行级别列表.
通常自己的服务使用等级 35 就可以了, 最多 2345 也就是
chkconfig servicename on
ntsysv: 类图形界面管理模式来设置开机启动 (RedHat 特有)
Linux ntsysv 命令用于设置系统的各种服务.
这是 Red Hat 公司遵循 GPL 规则所开发的程序, 它具有互动式操作界面, 您可以轻易地利用方向键和空格键等, 开启, 关闭操作系统在每个执行等级中, 所要执行的系统服务.
这种方式不算通用, 所以我这里就不赘述了, 有兴趣可以移步 Linux ntsysv: 设置系统服务 https://www.cnblogs.com/ihongyan/p/4154508.html
总结
开机启动项
添加脚本到或者命令 /etc/rc.d/rc.local
先把脚本放到 / etc/rc.d/init.d 下, 再使用
chkconfig servername on
命令添加 2345 运行级别到开机启动项 (脚本写的规则见详情)
ntsysv 不常用可以忽略
使用密码登陆时运行
把脚本放到 / etc/profile.d / 下
引用
Linux 下三种开机自启动服务的方式总结 https://www.linuxprobe.com/linux-autostart.html
Linux 添加开机启动项的三种方法.
Linux ntsysv 命令 http://www.runoob.com/linux/linux-comm-ntsysv.html
/etc/profile 文件和 / etc/profile.d
chkconfig 服务的添加, 顺序
Linux 系统开机启动项清理 https://zhuanlan.zhihu.com/p/45336481
来源: https://www.qcloud.com/developer/article/1416251