前边有几篇博客记录了redhat中系统的部署和nginx的部署使用,接下来记录一下设置开机自启的步骤。
mysql的开机自启
将服务文件拷贝到init.d下,并重命名为mysqld,注意处理以下命令的空格
cp /opt/install/mysql-5.7.33/support-files/mysql.server /etc/init.d/mysqld
赋予可执行权限
chmod +x /etc/init.d/mysqld
添加服务
chkconfig --add mysqld
可以通过查看服务命令列表确认
chkconfig --list
列表中如果mysql的345没有开启,则进行开启
chkconfig --level 345 mysqld on
以上步骤就完成了mysql的开机自启
Nginx开机自启
设置nginx开机启动,只需在rc.local增加启动代码即可。
敲黑板了!!!前提/etc/rc.d/rc.local是可执行文件,进行检查,如果不是可执行文件,修改为可执行文件,如果不是可执行文件,会无法自启。
chmod +x /etc/rc.d/rc.local
修改为可执行文件后,进行编辑,编辑时一定要注意,只要有一个命令错误,就会导致文件里所有的开机自启都不生效,所以一定要仔细检查命令。我在这个地方掉进坑里了,爬了很久的!!!!
vim /etc/rc.d/rc.local
在底部增加一行代码
/usr/local/nginx/sbin/nginx
看这张图,应该能够看到,不止开机自启了nginx,还自启了monitor.sh也就是更新系统时的监听脚本,以及tomcat启动脚本。
tomcat开机自启
同样,跟nginx一样,设置tomcat开机启动,只需在rc.local增加启动代码即可。
vim /etc/rc.d/rc.local
不同的是,在底部增加以下三行代码,因为tomcat的启动需要依赖jdk,所以在这里单独引入,不然会导致所有自启都不生效。掉进的坑就是这里!!!查了很久很久!!!
export JAVA_HOME=/opt/install/java/jdk1.8.0_271
export JAVA_JRE=/opt/install/java/jdk1.8.0_271/jre /opt/firewall/fwm/bin/script/start.sh
总结:如果设置完成后开机无法自启,那么进行检查
1、/etc/rc.d/rc.local 这个文件是不是可执行文件,不是的话请设置为可执行文件,命令上边有,不再追叙
2、检查所有的命令是否能够正常执行,一定要确保添加的所有命令能否正确执行,只要有一个无法执行,就会导致所有的设置都不生效
3、检查所有的命令都能够正常执行,还是不行,那么就需要检查一下日志了,执行以下命令
systemctl status rc-local.service -l
说一下我遇到的一个奇葩神坑,在开机之后执行启动tomcat的命令也就是/opt/firewall/fwm/bin/script/start.sh这个命令时,没有问题,能够正常启动,但是写进自启动里面怎么都启动不成功,导致其他设置也都不生效,于是各种百度,以下几个步骤时最靠谱的
判断启动级别,命令为 runlevel ,是否为3或5。可以使用命令“init 3”修改启动级别为3. 运行命令ls /etc/rc.d/rc3.d -l 判断,是否有S99local -> /etc/rc.d/rc.local 的软链接,文件名可能不一样,但要有 /etc/rc.d/rc.local的软链接,有的是 /etc/rc.local,反正就是你要运行的rc.local的文件。 如果没有则建立软链接,ln -s /etc/rc.d/rc.local /etc/rc.d/rc3.d/S99local 如果有 /etc/rc.d/rc.local链接,则判断权限是否为可执行,如果不是,可添加权限chmod +x /etc/rc.d/rc.local。 如果还没有执行,可能是你的rc.local代码本身就有问题。
于是,检查了启动等级,确实是3,查看确实没有软连接,于是设置软连接,开始已经设置为可执行权限,那么就剩下最后一个问题了,rc.local代码本身有问题,可是所有命令一个个都测试了,没有问题啊,真人让头大!!!!
那么就检查日志吧,输入上边提到的查看日志命令。
[root@localhost ~]# systemctl status rc-local.service -l ● rc-local.service - /etc/rc.d/rc.local Compatibility Loaded: loaded (/usr/lib/systemd/system/rc-local.service; static; vendor preset: disabled) Active: failed (Result: exit-code) since 日 2021-03-21 18:44:44 CST; 1min 13s ago Process: 1049 ExecStart=/etc/rc.d/rc.local start (code=exited, status=1/FAILURE) 3月 21 18:44:44 localhost.localdomain rc.local[1049]: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 3月 21 18:44:44 localhost.localdomain rc.local[1049]: At least one of these environment variable is needed to run this program 3月 21 18:44:44 localhost.localdomain rc.local[1049]: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 3月 21 18:44:44 localhost.localdomain rc.local[1049]: At least one of these environment variable is needed to run this program 3月 21 18:44:44 localhost.localdomain rc.local[1049]: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 3月 21 18:44:44 localhost.localdomain rc.local[1049]: At least one of these environment variable is needed to run this program 3月 21 18:44:44 localhost.localdomain systemd[1]: rc-local.service: control process exited, code=exited status=1 3月 21 18:44:44 localhost.localdomain systemd[1]: Failed to start /etc/rc.d/rc.local Compatibility. 3月 21 18:44:44 localhost.localdomain systemd[1]: Unit rc-local.service entered failed state. 3月 21 18:44:44 localhost.localdomain systemd[1]: rc-local.service failed.
看到标红的没,失败了,失败原因Neither the JAVA_HOME nor the JRE_HOME environment variable is defined,翻译过来就是 JAVA_HOME和JRE_HOME环境变量均未定义,
原来缺少依赖的环境变量,那么这不就好办了吗,嘴角微微上扬了,添加上去不就行了,引入所依赖的环境变量。
export JAVA_HOME=/opt/install/java/jdk1.8.0_271 export JAVA_JRE=/opt/install/java/jdk1.8.0_271/jre /opt/firewall/fwm/bin/script/start.sh
这是正常启动之后的日志结果
[root@localhost ~]# systemctl status rc-local.service -l ● rc-local.service - /etc/rc.d/rc.local Compatibility Loaded: loaded (/usr/lib/systemd/system/rc-local.service; static; vendor preset: disabled) Active: active (running) since 日 2021-03-21 18:10:39 CST; 7min ago Process: 1062 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS) CGroup: /system.slice/rc-local.service ├─1074 nginx: master process /usr/local/nginx/sbin/ngin ├─1079 nginx: worker process ├─1126 sh /opt/firewall/fwm/bin/script/monitor.sh fmsDaemon ├─1724 /opt/install/java/jdk1.8.0_271/jre/bin/java -Djava.util.logging.config.file=/opt/firewall/apache-tomcat-8.5.61/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /opt/firewall/apache-tomcat-8.5.61/bin/bootstrap.jar:/opt/firewall/apache-tomcat-8.5.61/bin/tomcat-juli.jar -Dcatalina.base=/opt/firewall/apache-tomcat-8.5.61 -Dcatalina.home=/opt/firewall/apache-tomcat-8.5.61 -Djava.io.tmpdir=/opt/firewall/apache-tomcat-8.5.61/temp org.apache.catalina.startup.Bootstrap start └─2409 sleep 1 3月 21 18:10:39 localhost.localdomain rc.local[1062]: at java.net.Socket.<init>(Socket.java:228) 3月 21 18:10:39 localhost.localdomain rc.local[1062]: at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:504) 3月 21 18:10:39 localhost.localdomain rc.local[1062]: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 3月 21 18:10:39 localhost.localdomain rc.local[1062]: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 3月 21 18:10:39 localhost.localdomain rc.local[1062]: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 3月 21 18:10:39 localhost.localdomain rc.local[1062]: at java.lang.reflect.Method.invoke(Method.java:498) 3月 21 18:10:39 localhost.localdomain rc.local[1062]: at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:388) 3月 21 18:10:39 localhost.localdomain rc.local[1062]: at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478) 3月 21 18:10:39 localhost.localdomain rc.local[1062]: Tomcat started. 3月 21 18:10:39 localhost.localdomain systemd[1]: Started /etc/rc.d/rc.local Compatibility.
于是大功告成。自启设置结束,nginx还有tomcat以及监听自动更新的脚本都能够成功自启了。
还有其他方式,不过还没有尝试,等我尝试了再进行记录。先保留一下参考链接:
https://blog.csdn.net/pro_fan/article/details/102844734 解决Neither the JAVA_HOME nor the JRE_HOME environment variable is defined问题
https://blog.csdn.net/q979392157/article/details/81353975 Linux环境下配置tomcat开机自动启动的两种方法
https://blog.csdn.net/kexuanxiu1163/article/details/107437981 Linux系统如何设置开机自动运行脚本?
http://blog.itpub.net/26736162/viewspace-2700906/ /etc/rc.d/rc.local不执行的解决办法
记在最后,其实这次走完全过程后,获取到最大的帮助下,是如何根据日志查找问题,而不是一上来就无头苍蝇一样,各种百度,如果我一开始就查看开机自启日志,看到报错,就不可能花费了一下午的时间,去研究这个事情,仅作记录,以作警示。希望等给看到这篇博客的人一点帮助。
加油吧,菜鸟!!!
现在记录一下第二个开机自启的步骤
切换到安装了tomcat/bin的目录下
必须使用root权限。
用vi startup.sh 编辑文件
vi /opt/firewall/apache-tomcat-8.5.61/bin/start.sh
然后在startup.sh的文件开头的地方添加如下内容,不要因为是注释的代码就不加了,还是需要加的!!!
#chkconfig:2345 80 90 #description:tomcat auto start #processname:tomcat
如下图片
再修改catalina.sh文件
vi /opt/firewall/apache-tomcat-8.5.61/bin/catalina.sh
在命令模式下,搜索/export,添加几个变量,地址改成自己的
export CATALINA_BASE=/opt/firewall/apache-tomcat-8.5.61/bin/ export CATALINA_HOME=/opt/firewall/apache-tomcat-8.5.61/bin/ export CATALINA_TEMDIR=/opt/firewall/apache-tomcat-8.5.61/bin/
如下图片
再次设置setclasspath.sh,
vi /opt/firewall/apache-tomcat-8.5.61/bin/setclasspath.sh
添加内容,配置环境变量,敲黑板了!!!这是重点啊,要是这里不设置,自启启动不了的,还是需要依赖环境变量的,这也是一个大坑,掉进去我也爬了很久才出来的,参考链接并没有这一步,结果一直无法启动。可能是我之前的环境变量有问题吧,反正现在自启都需要手动配置一下
JAVA_HOME=/opt/install/java/jdk1.8.0_271 JRE_HOME=/opt/install/java/jdk1.8.0_271/jre
如下图片:
这三个文件修改完,直接在bin目录下启动试一下,如果出错赶紧改。
添加软连接
ln -s /opt/firewall/apache-tomcat-8.5.61/bin/startup.sh /etc/rc.d/init.d/tomcat7
然后cd 到/etc/rc.d/init.d/目录
cd /etc/rc.d/init.d/
用ll查看一下tomcat是否有可执行权限?
如果没有的话使用chmod +x tomcat7添加执行权限
然后用chkconfig –add tomcat7 添加开机启动服务
最后使用chkconfig –list确认一下是否添加成功
[root@localhost init.d]# chkconfig --list 注:该输出结果只显示 SysV 服务,并不包含 原生 systemd 服务。SysV 配置数据 可能被原生 systemd 配置覆盖。 要列出 systemd 服务,请执行 'systemctl list-unit-files'。 查看在具体 target 启用的服务请执行 'systemctl list-dependencies [target]'。 mysqld 0:关 1:关 2:开 3:开 4:开 5:开 6:关 netconsole 0:关 1:关 2:关 3:关 4:关 5:关 6:关 network 0:关 1:关 2:开 3:开 4:开 5:开 6:关 rhnsd 0:关 1:关 2:开 3:开 4:开 5:开 6:关 tomcat7 0:关 1:关 2:开 3:开 4:开 5:开 6:关 [root@localhost init.d]#
然后就可以重启linux系统了
reboot