CentOS7修改开机启动脚本报错a start job is running for /etc/rc.d/rc.local

文章目录

    • rc.local介绍
    • 报错场景
    • 排查处理
    • 小结

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系统,对于开发人员来说,还是有必要熟悉的,一边学习总结,一边继续熟悉它吧

你可能感兴趣的:(Linux,异常报错,linux,centos,虚拟机,rc.local,启动卡死)