文章目录
rc.local介绍
/etc/rc.d/rc.local
是一个在Linux系统启动时自动执行的脚本文件。它可以用户自定义一些系统启动后需要立即执行的命令。- 在系统启动时,
/etc/rc.d/rc.local
脚本文件会被执行一次,执行过程中其中的命令都会被自动执行。 - 用户可以通过编辑这个文件来添加自己的命令,比如启动一个特定的服务、挂载某个文件系统等。
注意,要想让
/etc/rc.d/rc.local
文件在系统启动时被执行,需要先保证它有运行权限。
用户可以通过chmod
命令来修改该文件的权限,使其可读、可写、可执行。
另外需要注意的是,近些年来,/etc/rc.d/rc.local
的使用渐渐被 systemd 机制取代,因此有可能在一些新的Linux系统上,该文件已经不再被使用。
报错场景
- 将我们的平台服务重启脚本
docker-restart.sh
加入到CentOS7的开机自启动里面,有兴趣了解细节的小伙伴可以参考我这篇博客:Linux:将应用服务的重启脚本加入CentO7的开机启动里,实现断电重启服务自启动 - 重启服务器,验证平台服务的自启动效果,发现并没有启动起来,一直卡在启动界面
- 想着是不是卡死了,就把虚拟机强制关机,继续启动,还是一样的问题,现在确定不是卡死了
- 在按下
ESC
键后,可以看到虚拟机启动的日志,最新一行是类似的日志:a start job is running for /etc/rc.d/rc.local
,发现卡在我的脚本的执行上 - 暂时不去动它,等它执行完成。等2分钟后,系统启动起来了,但是我的平台服务没有启动成功
排查处理
- 执行报错,最主要的是要找到报错日志,查看具体的报错原因,这个是关键点
- 可以使用
systemctl status rc-local.service
查看rc-local
在服务器启动时执行过程中输出的一些日志,之前没想到去用这个命令去看日志,排查起来费劲,浪费了不少时间 - 这个命令只能看到部分日志,执行失败的部分日志,如下
[root@localhost home]# systemctl status rc-local.service
● rc-local.service - /etc/rc.d/rc.local Compatibility
Loaded: loaded (/usr/lib/systemd/system/rc-local.service; static; vendor preset: disabled)
Active: active (exited) since 二 2023-06-06 14:09:05 CST; 32min ago
Process: 1414 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)
Tasks: 0
Memory: 0B
6月 06 14:08:08 localhost.localdomain rc.local[1414]: Can't find a suitable configuration file in this directory or any
6月 06 14:08:08 localhost.localdomain rc.local[1414]: parent. Are you in the right directory?
6月 06 14:08:08 localhost.localdomain rc.local[1414]: Supported filenames: docker-compose.yml, docker-compose.yaml
6月 06 14:08:34 localhost.localdomain rc.local[1414]: Can't find a suitable configuration file in this directory or any
6月 06 14:08:34 localhost.localdomain rc.local[1414]: parent. Are you in the right directory?
6月 06 14:08:34 localhost.localdomain rc.local[1414]: Supported filenames: docker-compose.yml, docker-compose.yaml
6月 06 14:09:05 localhost.localdomain rc.local[1414]: Error response from daemon: No such container: nginx
6月 06 14:09:05 localhost.localdomain rc.local[1414]: 当前目录为:/
6月 06 14:09:05 localhost.localdomain rc.local[1414]: 所有命令执行完成,请稍等1分钟后,访问ip地址,查看界面是否正常展示!
6月 06 14:09:05 localhost.localdomain systemd[1]: Started /etc/rc.d/rc.local Compatibility.
Hint: Some lines were ellipsized, use -l to show in full.
- 虽然只有部分日志,但是已经足够了,关键日志是这一句
Supported filenames: docker-compose.yml, docker-compose.yaml Can't find a suitable configuration file in this directory or any parent. Are you in the right directory
- 是说没找到
docker-compose.yml
文件,我又看了下我的重启脚本,发现只写了相对路径docker-compose up -d
,这个原因导致找不到docker-compose.yml
文件 - 改成绝对路径(
docker-compose -f /home/signal/instance/docker-compose.yml up -d
)后,再重启服务,看到问题已解决,正确执行的日志如下:
[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 (exited) since 二 2023-06-06 15:07:49 CST; 20s ago
Process: 1436 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)
Tasks: 0
Memory: 0B
6月 06 15:06:49 localhost.localdomain rc.local[1436]: unit is up-to-date
6月 06 15:06:49 localhost.localdomain rc.local[1436]: Creating nginx ...
6月 06 15:06:49 localhost.localdomain rc.local[1436]: Creating led ...
6月 06 15:06:49 localhost.localdomain rc.local[1436]: Creating core ...
6月 06 15:06:49 localhost.localdomain rc.local[1436]: Creating viproute ...
6月 06 15:06:49 localhost.localdomain rc.local[1436]: Creating data-collection ...
6月 06 15:07:49 localhost.localdomain rc.local[1436]: [334B blob data]
6月 06 15:07:49 localhost.localdomain rc.local[1436]: 当前目录为:/home/signal/instance
6月 06 15:07:49 localhost.localdomain rc.local[1436]: 所有命令执行完成,请稍等1分钟后,访问ip地址,查看界面是否正常展示!
6月 06 15:07:49 localhost.localdomain systemd[1]: Started /etc/rc.d/rc.local Compatibility.
- 此时又有一个问题,我们的平台服务较多,启动较慢,拖慢了整个系统的重启进程
- 有的客户机器配置比较差,启动完所有服务可能要四五分钟,外在表现就是一直卡在启动桌面,客户可能觉得卡住了又去重启
- 修改也很简单,在
/etc/rc.d/rc.local
文件里,将脚本运行改为后台启动,即sh /home/docker-restart.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 二 2023-06-06 15:22:59 CST; 1min 55s ago
Process: 1423 ExecStart=/etc/rc.d/rc.local start (code=exited, status=0/SUCCESS)
Main PID: 1425 (sh)
Tasks: 9
Memory: 39.1M
CGroup: /system.slice/rc-local.service
├─1425 sh /home/docker-restart.sh
└─1433 docker network create signal-network
6月 06 15:22:59 localhost.localdomain systemd[1]: Starting /etc/rc.d/rc.local Compatibility...
6月 06 15:22:59 localhost.localdomain systemd[1]: Started /etc/rc.d/rc.local Compatibility.
6月 06 15:22:59 localhost.localdomain rc.local[1423]: 当前目录为:/home
6月 06 15:22:59 localhost.localdomain rc.local[1423]: 已加入重启脚本
小结
- 所有错误,都有原因。而且我想说的一点,现在的Linux系统已经做得比较完善了,至少出错都是会有各种对应的日志输出的
- 处理问题,要对症下药,要找到报错日志,根据日志输出内容去分析。不能臆想瞎猜,不能原地踏步吧的去重启(但是,事实上,重启能解决很多问题,至少暂时的)
- Linux系统,对于开发人员来说,还是有必要熟悉的,一边学习总结,一边继续熟悉它吧