shell脚本在linux重启之后继续运行

这篇具有很好参考价值的文章主要介绍了shell脚本在linux重启之后继续运行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

shell脚本在linux重启之后继续运行

问题

首先,我是需要写一个hadoop集群启动的脚本,脚本代码中有需要重启Linux
的操作,那么如何在重启Linux后,继续执行脚本中的代码呢?
我暂时查询到的方法如下:

一. nohup命令

nohup ./script.sh > log 2>&1 &

nohup命令用于忽略HUP信号(当用户退出登录时会发送这个信号),保证脚本不会因为用户退出而停止运行;
&符号用于将脚本放入后台运行;
>符号用于将标准输出重定向到log文件中;
2>&1则用于将标准错误输出也重定向到log文件中。

该命令只是将script.sh脚本文件放入后台运行,我们关闭命令行窗口时,不会影响该脚本的执行。
但是当脚本中执行到reboot重启命令时,linux重启,但重启之后的脚本代码依旧不会执行。


二. Systemd服务和开机自启动

要让shell脚本在Linux重启之后继续运行,可以使用Systemd服务来实现。具体步骤如下:

1.编写需要执行的shell脚本,并保存为script.sh文件。

2.创建一个Systemd服务配置文件,在终端中执行以下命令:

sudo vim /etc/systemd/system/script.service

在打开的文件中,添加以下内容:

[Unit]
Description=My Script Service

[Service]
ExecStart=/path/to/script.sh
Restart=always
User=myuser

[Install]
WantedBy=multi-user.target

其中,
Description用于描述服务的名称;
ExecStart指定需要执行的脚本文件路径;
Restart设置为always表示服务遇到错误时会自动重启;
User指定运行服务的用户。

3.保存并关闭文件,然后重新加载Systemd服务配置文件,执行以下命令:

sudo systemctl daemon-reload

4.启动服务,执行以下命令:

sudo systemctl enable script.service

sudo systemctl start script.service

5.验证服务是否正常运行,执行以下命令:

sudo systemctl status script.service

会显示如下:

● script.service - My Script Service
   Loaded: loaded (/etc/systemd/system/script.service; enabled; vendor preset: disabled)
   Active: inactive (dead)


取消服务的自启动
systemctl disable script.service
# 重启后生效

手动停止服务

systemctl stop script.service


centos7开机登陆页面死循环问题

为了测试这个开机自启动服务,我写了一个有reboot 命令的脚本代码
但是结果是遇到一个重启无限循环的问题
就是开启自启动服务后,会执行脚本代码,执行reboot重启命令,
然后就会陷入一个重启的无限循环中

解决

VMware下centos7开机登陆页面死循环问题详细解决

shell 脚本中有重启liunx的命令,如何防止陷入重启的死循环中

示例代码:

#!/bin/bash

# 检查系统是否已经在重启过程中
if [ -f /var/run/reboot-required ]; then
  echo "System is already scheduled for reboot. Skipping..."
  exit 0
fi

# 执行重启命令
sudo reboot

在shell脚本中,-f是一个条件测试运算符,
用于测试一个文件是否存在并且是一个普通文件。
具体来说,它会检查指定的路径是否存在并且是否为一个常规文件
(即不是目录或特殊设备文件等)。
除了-f运算符外,还有其他条件测试运算符可用于测试文件,
例如
-d(测试是否为目录)、
-e(测试是否存在任何类型的文件)、
-r(测试是否可读)等等。

/var/run/reboot-required文件是什么

该文件是由unattended-upgrades软件包创建的,并在更新安装后检查,以确定是否需要重启系统。如果应用了某些更新,例如内核更新或其它系统级别的更新,那么这些更新需要在系统重新启动后才能生效,因此该软件包会创建/var/run/reboot-required 文件来提醒管理员重新启动系统。

当管理员执行重启命令时,该文件将被删除,并且系统将重新启动。
因此,/var/run/reboot-required 文件的存在指示着系统已经需要进行重启操作,而不是重启操作已经完成。

简单解释
就是当安装了更新或者升级软件包等操作后,系统可能会要求重启以使更改生效。此时系统会在 /var/run/ 目录下创建一个名为 reboot-required 的文件,用来表示系统需要重启。因此,通过判断该文件是否存在,我们可以知道系统当前是否需要重启。

unattended-upgrades软件包是什么,centos7最小化安装时,会有这个软件包吗

unattended-upgrades是Debian/Ubuntu操作系统中的一个软件包,用于自动升级系统中的软件包和安全补丁。CentOS 7最小化安装通常不会包含此软件包,因为它是基于Red Hat Enterprise Linux (RHEL)而不是Debian/Ubuntu。

————————————————
注意:到此我们知道了,if [ -f /var/run/reboot-required ]; then
该脚本代码不满足我们的需求,并且在centos7中不起作用


创建标识文件,解决了重启后无限循环的问题

但是我们知道了一个方法
我们可以在执行reboot重启命令之前,先创建一个标识文件,
重启之后,判断这个标识文件是否存在,如果存在就不执行重启命令

测试代码如下:

#!/bin/bash

# 判断系统是否需要重启
if [ -e /shell_01/reboot-required ];
then
        #sleep 60 # 等待60秒
        echo "重启之后"
        echo "bbbbbbbbbbbbbbbbbbbb"
        sum=0
        n=1

        while ((n<=100))
        do
                ((sum+=n))
                ((n++))
                echo "重启之后"
                echo $sum
        done
else
        mkdir -p /shell_01/reboot-required
        reboot
fi

上述代码的意思就是运行脚本时,先判断/shell_01/reboot-required该标识文件是否存在,如果不存在,就先创建reboot-required并且执行重启命令,
如果将该脚本设置为开机自启动,那么重启后该脚本又会自动执行,先判断是否存在标识文件,存在,则执行下面的代码

这样就解决了linux开机界面不断重启的问题(也就是重启的无限循环问题),


设置开机自启动

vim /etc/systemd/system/script.service

内容如下:

[Unit]
Description=My Script Service

[Service]
Type=simple
ExecStart=/bin/bash -c '/shell_01/t.sh &> /shell_01/log &'
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target

-c后的 /shell_01/t.sh &> /shell_01/log & 命令
运行该脚本,将该脚本的输出重定向到/shell_01/log 文件中

开启自启动服务后,在控制台运行 /shell_01/t.sh &> /shell_01/log &

结果是会先重启,重启之后,查看/shell_01/log

结果符合预期设想

至此,shell脚本在linux重启之后继续运行的问题算是解决了

总结

shell脚本在linux重启之后继续运行问题
可以创建一个标识文件,判断该标识文件不存在则先创建标识文件再执行重启命令
若该文件存在则继续执行下面的代码
并且配合linux的自启动服务来完成

当然也可以不创建自启动服务,连续运行两次脚本也可以
也就是在未重启之前运行一次脚本,liunx会重启,
重启之后,在运行一次脚本,就会执行重启之后的命令文章来源地址https://www.toymoban.com/news/detail-431821.html

到了这里,关于shell脚本在linux重启之后继续运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux shell编程学习笔记14:编写和运行第一个shell脚本hello world!

     * 20231020 写这篇博文断断续续花了好几天,为了说明不同shell在执行同一脚本文件时的差别,我分别在csdn提供线上Linux环境 (使用的shell是zsh)和自己的电脑上(使用的shell是bash)做测试。功夫不负有心人,在其中一些实例中可以体现出zsh和bash的对脚本文件支持的差别,收

    2024年02月07日
    浏览(19)
  • 电脑开机正常启动,运行一整子之后电脑突然关机重启报错0xc000001

    电脑自动重启或者蓝屏报错0x0000001错误导致系通无法开机或者运行不久就会重启等问题? 错误代码:0xc0000001表示引导设备可能存在某些问题,或者某些引导文件已损坏。如果计算机的引导扇区发生某些问题,也可能发生这种情况。系统文件损坏或内存损坏是比较常见的原因

    2024年02月12日
    浏览(16)
  • 在SHELL脚本中用curl处理服务器开机、关机、强制关机、重启动作

    思路:利用了一张主控板来获取服务器的开关机状态,开关机其实是给服务器一个500ms~1000ms的脉冲,等同与按了机箱面板的开关机按钮开关。

    2024年02月07日
    浏览(18)
  • 在shell脚本中切换用户之后再执行多个函数以及执行多行命令的方法和遇到的问题

    其中,username是您要切换到的用户的用户名,function1和function2是您要执行的函数名称,您可以根据需要添加更多函数和命令。在EOF标记之间的所有内容都将作为切换后的用户执行。请注意,您需要确保切换后的用户具有执行所需命令和函数的权限。 其中,username为要切换到的

    2024年02月04日
    浏览(61)
  • shell脚本查询脚本否在运行

    可以使用 ps 命令来查询脚本是否正在运行。例如,要查询名为 script.sh 的脚本是否正在运行,可以使用以下命令: 如果脚本正在运行,则 grep 命令会输出包含脚本名称的行;如果脚本没有运行,则不会有输出。 注意:如果有多个脚本正在运行,且脚本名称中包含了 script.sh

    2024年02月06日
    浏览(13)
  • android 运行shell 脚本文件或shell命令

    android 运行shell 脚本文件或shell命令 一.运行shell脚本文件 1.test.sh文件内容 #!/bin/bash echo \\\"I am a script\\\" ps 2.将shell文件拷贝到Android设备目录 3.执行脚本文件 Runtime.getRuntime().exec(\\\"sh /sdcard/lilei/test.sh\\\"); 注: 应用需要有存储访问权限,如果shell文件中有文件访问请用绝对路径,否则访问

    2024年03月12日
    浏览(27)
  • 安卓系统开机运行shell脚本

    在安卓系统上很多业务需求是通过shell脚本实现的,开机自启动一般做法是创建安卓service服务,然后通过该服务调用执行shell脚本。详细步骤: 如下shell脚本功能为:循环查询系统下是否有厂商ID为0x1A86的USB转串口设备匹配到了CDC-ACM驱动上,若是则解绑USB设备和CDC-ACM驱动的绑

    2024年02月08日
    浏览(20)
  • SHELL的脚本编辑与运行

    目录 1.编写脚本for1.sh,使用for循环创建20账户,账户名前缀由用户从键盘输入,账户初始密码由用户输入,例如:test1、test2、test3、、test10 a.编辑脚本 b.运行脚本 c.进行检验 2.编写脚本for2.sh,使用for循环,通过pig命令测试网段的主机连通性,网段前3段由用户输入,如:输入19

    2023年04月26日
    浏览(9)
  • shell脚本开机自启动运行

    准备需要启动执行的shell。 例如: -PC:~$ sudo vi auto-start-shell.sh 方案1: 1、创建脚本启动文件。 -PC:~$ sudo vi auto-start-shell.desktop 2、将shell脚本放到/usr/bin/,脚本启动文件放到/etc/xdg/autostart/。 3、重启系统三次,验证shell执行情况,本例查看~/Desktop/ceshi/cs.txt 4、说明: 该方法在需

    2024年02月13日
    浏览(16)
  • 如何查看正在运行的shell脚本程序

    要查看正在运行的shell脚本程序,可以使用ps命令来列出当前正在运行的进程,并使用grep命令来筛选出与shell脚本相关的进程。具体命令如下: 其中,ps命令用于列出所有进程的详细信息,-ef选项用于显示所有进程的详细信息。grep命令用于在ps命令的输出中查找包含“sh”关键

    2024年02月06日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包