Linux中/etc/init.d和/etc/rc.local以及systemctl之间的区别和联系
Linux命令,开机自启的三种方式
目录
`/etc/init.d`或者`/etc/rc.local`或者`systemctl`都可以实现开机启动
系统的运行级别(前置知识)
级别 | 备注 |
---|---|
运行级别0 | 系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 |
运行级别1 | 单用户工作状态,root权限,用于系统维护,禁止远程登陆 |
运行级别2 | 多用户状态(没有网络) |
运行级别3 | 完全的多用户状态(有网络),登陆后进入控制台命令行模式 |
运行级别4 | 系统未使用,保留 |
运行级别5 | X11控制台,登陆后进入图形GUI模式 |
运行级别6 | 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动 |
/etc/init.d
目录/etc/init.d/中包含许多系统服务的启动和停止脚本,它控制着各种事务。当然,/etc/init.d/远远没有这么简单。
当你查看/etc/目录时,会发现rc0-6.d(rc0.d、rc1.d…rc6.d)形式的目录,在这些目录下包含许多控制进程的脚本。这些脚本以"K"或者"S"开头,以"K"开头的脚本运行在以"S"开头的脚本之前。这些脚本放置的位置,决定了脚本什么时候开始运行。
/etc/init.d/command 选项
command
是运行的命令,选项可以有如下几种
start
stop
reload
restart
force-reload
比如:
/etc/init.d/network stop
或者:
/etc/init.d/network restart
目录/etc/init.d/
下常用脚本有
当然,你也可以有更多脚本,取决于你的系统版本和自己添加的。
/etc
目录展示(只展示相关目录和文件、链接):
etc:
init.d: -- init.d -> rc.d/init.d
functions
mst
mysql -- mysql -> /usr/local/mysql5.7/mysql.server
netconsole
network
rc0.d: -- rc0.d -> rc.d/rc0.d
K50netconsole -- K50netconsole -> ../init.d/netconsole
K90network -- K90network -> ../init.d/network
rc1.d: -- rc1.d -> rc.d/rc1.d
K50netconsole -- K50netconsole -> ../init.d/netconsole
K90network -- K90network -> ../init.d/network
rc2.d: -- rc2.d -> rc.d/rc2.d
K50netconsole -- K50netconsole -> ../init.d/netconsole
K90network -- K90network -> ../init.d/network
rc3.d: -- rc3.d -> rc.d/rc3.d
K50netconsole -- K50netconsole -> ../init.d/netconsole
K90network -- K90network -> ../init.d/network
rc4.d: -- rc4.d -> rc.d/rc4.d
K50netconsole -- K50netconsole -> ../init.d/netconsole
K90network -- K90network -> ../init.d/network
rc5.d: -- rc5.d -> rc.d/rc5.d
K50netconsole -- K50netconsole -> ../init.d/netconsole
K90network -- K90network -> ../init.d/network
rc6.d: -- rc6.d -> rc.d/rc6.d
K50netconsole -- K50netconsole -> ../init.d/netconsole
K90network -- K90network -> ../init.d/network
rc.d:
init.d:
functions
mst
mysql -- mysql -> /usr/local/mysql5.7/mysql.server
netconsole
network
rc0.d:
rc1.d:
rc2.d:
rc3.d:
rc4.d:
rc5.d:
rc6.d:
rc.local
rc.local -- rc.local -> rc.d/rc.local
从目录结构得知,/etc/init.d
是符号链接文件,实际链接到目录/etc/rc.d/init.d
关于目录/etc/rc.d/init.d
大多数Linux发行版中,启动的是目录
/etc/rc.d/init.d
下的服务,这个目录下存放的是实际的服务脚本。
Linux的每个运行级别,在 /etc/rc.d/ 下都有一个子目录分别是 rc0.d,rc1.d …… rc6.d,其实这些 rcN.d/目录下存放的都是链接到目录/etc/rc.d/init.d/ 下部分脚本链接文件。每个级别要执行的服务就在相对应的目录下,比如级别 5要启动的服务就都放在 rc5.d/ 下,但是放在这个 rc5.d/ 下的都是一些链接文件,链接到 /etc/rc.d/init.d/中相对应的实际脚本文件。
例如,目录 /etc/rc.d/rc2.d/ 下的S90network 链接文件,实际是链接到目录 /etc/rc.d/init.d/下的脚本文件network。
/etc/rc.local
/etc/rc.local
是一个脚本文件,从上面 /etc 文件路径可知,它链接到/etc/rc.d/rc.local
。它在运行级别3中执行一次,根据脚本命令一行一行读取执行,且在开机执行一次完成后进行系统用户登录。
/etc/init.d和/etc/rc.local的区别
/etc/init.d | /etc/rc.local |
---|---|
这是一个文件夹,里面放的是shell脚本,脚本的头部需要定义启动的级别 | 这是一个文件,文件中保存的是要执行的shell脚本的路径 |
一般都是rpm安装时自带的启动,停止,重启等功能脚本 | 一般是用户自定义的脚本 |
执行权限高,有0-6级别 | 只能在执行权限3以后执行 |
同级别以K开头的脚本运行在以S开头的脚本之前 | 按文件中的命令依次执行,执行顺序跟命令所在的行有关 |
systemctl
systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。
- 编写系统服务文件
# vi /etc/systemd/system/myapp.service
----------------------------------------------------
#如果/etc/systemd/system/myapp.service有过修改,需要进行更新,执行下面这个命令
#systemctl daemon-reload
#查看服务是否被正确识别
#systemctl list-unit-files|grep myapp
[Unit]
#服务描述,写有意义的内容,便于识别
Description=myapp service
[Service]
Type=simple
#设置应用的工作目录
WorkingDirectory=/myapp_path
ExecStart=/myapp_path/startMyApp.sh
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
- 查看系统服务文件是否被识别
systemctl list-unit-files|grep myapp
--------------------------
myapp.service disabled
- 编写程序启动脚本
# vi /myapp_path/startMyApp.sh
----------------------------------------------------
#!/bin/sh
#上面这行很重要,会报203错误
#最好先cd到程序目录
cd /myapp_path
#使用java的绝对路径。如果找不到java可执行程序,也会报203错误
/usr/java/jdk1.8/bin/java -jar myapp.jar
设置执行权限
chmod +x myapp.sh
- 服务操作
# 启动服务
systemctl start myapp.service
# 停止服务
systemctl stop myapp.service
# 开机自启
systemctl enable myapp.service
systemctl list-unit-files|grep myapp
--------------------------
myapp.service enabled
# 关闭开机自启
systemctl disable myapp.service
systemctl list-unit-files|grep myapp
--------------------------
myapp.service disabled
- 可能碰到的203错误
ExecStart参数指定启动脚本路径不对,会提示203错误。(改对就好了。)
启动程序脚本(.sh文件)中未指定脚本解析器,会提示203错误。(在文件开头添加:#!/bin/sh)
启动程序脚本(.sh文件)没有执行权限,会提示203错误。(chmod +x myapp.sh)
service 文件是使用 systemd 作为初始化程序的 Linux 系统才有的服务文件,叫“服务配置单元文件”,用来取代旧初始化系统中的脚本文件,但是他们可能会同时存在系统中。
如果同时存在的话,在目录 /etc/init.d/ 下的脚本文件的优先级会高于目录 /etc/systemd/system/ 下的 service 文件。
总结
对于管理脚本操作推荐使用systemctl,例如Redis编译安装完成后,直接运行install_server.sh(Redis目录下有此文件,仔细找找),会自己生成服务,条用service redis服务名 restart
(或者 systemctl restart redis服务名
)等命令启动服务。
*
而开机自启建议写在rc.local
脚本文件中,这么做的目的是便于管理自启项。
注意第10行那句# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
,不仅要给chmod +x /etc/rc.local
还要chmod +x /etc/rc.d/rc.local
,这样自启动脚本才有执行权限。另外,本人亲测,不要在rc.local脚本中使用nohup
指令,不然会杀死相关进程,具体原因没做过多了解,有兴趣的小伙伴可以在评论里说一下。比如一些jar程序,直接java -jar xxx.jar
就行,或者和作者一样/usr/bin/su - root -c "某些script"
。
注意
以上关于脚本的文件,不管是.sh文件还是链接文件,均需要执行权限
chmod 755 *.sh
或者chmod +x *.sh
以上关于脚本的文件,不管是.sh文件还是链接文件,均需要执行权限
chmod 755 *.sh
或者chmod +x *.sh
以上关于脚本的文件,不管是.sh文件还是链接文件,均需要执行权限
chmod 755 *.sh
或者chmod +x *.sh
更多推荐
所有评论(0)