`/etc/init.d`或者`/etc/rc.local`或者`systemctl`都可以实现开机启动

系统的运行级别(前置知识)

级别备注
运行级别0系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2多用户状态(没有网络)
运行级别3完全的多用户状态(有网络),登陆后进入控制台命令行模式
运行级别4系统未使用,保留
运行级别5X11控制台,登陆后进入图形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。

–by Linux 目录之 /etc/init.d/ 介绍

/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系统和服务管理器。
system

  1. 编写系统服务文件
# 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
  1. 查看系统服务文件是否被识别
systemctl list-unit-files|grep myapp
--------------------------
myapp.service                      disabled
  1. 编写程序启动脚本
# 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
  1. 服务操作
# 启动服务
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
  1. 可能碰到的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

Logo

更多推荐