精华内容
下载资源
问答
  • 本篇文章给大家分享了Linux关机执行指定脚本功能的实现详解,对此有需要的朋友跟着小编一起学习下。
  • 最近碰到一个需求是需要在ubuntu中插入一个关机脚本,在系统关机之前执行它。在网上浏览了很多资料,但是没有切实可行的方法,大多数的博客都是比较陈旧的方法,可能已经不适用于最新的...首先,关于关机执行脚...

    最近碰到一个需求是需要在ubuntu中插入一个关机脚本,在系统关机之前执行它。在网上浏览了很多资料,但是没有切实可行的方法,大多数的博客都是比较陈旧的方法,可能已经不适用于最新的ubuntu18.04的系统。所以花了大概一整天的时间研究了一下,顺便清楚了关于ubuntu运行状态和service的相关知识,在这里按照当时钻研的思路简单记录一下,不感兴趣的可以直接看最后的用法。

    首先,关于关机执行脚本,网上最多的方法应该是下面描述的:

    (1)在"/etc/init.d"下面创建脚本:

    touch /etc/init.d/myscript

    (2)使用update-rc.d工具或者手动创建连接(update-rc.d工具使用方法会在另一片文章中介绍,这里使用手动创建连接的方法,但这样作是为了易于理解,如果会使用的话,建议还是使用update-rc.d工具),如下:

    ln -s /etc/init.d/myscript /etc/rc0.d/K99myscript
    ln -s /etc/init.d/myscript /etc/rc6.d/K99myscript 

    但是按照上面的方法执行完成之后重启,发现脚本并没有执行(所使用的是ubuntu18.04的版本,下同)。

    那么现在就需要自己进行研究了,首先清楚上面这个方法的原理。ubuntu有几个运行等级,分别是S 0 1 2 3 4 5 6,代表的意义如下:

    0 – Halt,关机模式
    1 – Single,单用户模式
    2 - Full multi-user with display manager (GUI)
    3 - Full multi-user with display manager (GUI)
    4 - Full multi-user with display manager (GUI)
    5 - Full multi-user with display manager (GUI)
    6 – Reboot,重启

     

    其中S代表全部,2345是不同的多用户模式,在广义上没有任何区别。而ubuntu在不同级别启动或终止的时候,都回去执行相应的"/etc/rcX.d"下面的脚本。所以我们理解了上面的方法,分别在"/etc/rc0.d"和"/etc/rc6.d"下面创建的我们所要执行的脚本的连接,就是要系统在关机和重启的时候都去执行它。那么问题来了,我们明明创建了软连接,为什么脚本没有执行呢?

    这个时候我查看了"/etc/init.d"中的其他一些脚本,发现他们的运行模式都是start 2 3 4 5 stop 0 1 6。就是在2345这四个等级下启动,在016这三个等级下关闭。于是我尝试下面命令,让我的脚本也同样在2345启动016停止,先删除之前创建的连接:

    rm /etc/rc0.d/K99myscript
    rm /etc/rc6.d/K99myscript

    在按照下面命令创建连接,让脚本在2345启动016停止:

    ln -s /etc/init.d/myscript /etc/rc0.d/K99myscript
    ln -s /etc/init.d/myscript /etc/rc1.d/K99myscript
    ln -s /etc/init.d/myscript /etc/rc2.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc4.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc5.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc6.d/K99myscript 

    然后重启,这时发现脚本在开机和关机时被分别执行一次。那么我们到现在为止可以得到,就是"/etc/rcX.d"下面的脚本式会在相应的动作执行时被启动的。而且我们在"/etc/rc0.d"和"/etc/rc6.d"下面的软连接也被执行了。那么到此时,问题转化为了为什么我们单独在0 6下面创建软连接没有被执行,而我们在0 1 2 3 4 5 6 下面都创建软连接时,就被执行了呢?

    我们注意到软连接在脚本名字前被加上了S99或K99,这是一种标志,S或K表示动作,S表示运行,K表示停止,99表示这个脚本启动的序列。我们注意到"/etc/init.d"下面的脚本,有很多是需要一直不间断的运行的,所以需要在系统启动时开启,在系统结束时停止。那么对应的他们就要在文件夹2345(即"/etc/rc2.d"、"/etc/rc3.d",下同)下面有一个启动脚本,在016下面有一个终止脚本。所以我们现在可以猜到:系统会在启动时调用2345下面的脚本启动他们,结束时调用016下面的脚本终止他们。然后我此时的思路是,那么我们需要在系统结束时启动我们的脚本,是不是说我们要在"/etc/rc0.d"和"/etc/rc6.d"下面创建S开头的脚本而不是K开头的脚本呢?

    于是,先删除我们之前创建的脚本:

    rm /etc/rc0.d/K99myscript
    rm /etc/rc1.d/K99myscript
    rm /etc/rc2.d/S99myscript
    rm /etc/rc3.d/S99myscript
    rm /etc/rc4.d/S99myscript
    rm /etc/rc5.d/S99myscript
    rm /etc/rc6.d/K99myscript

    然后在016这三个文件夹下面创建S开头的软连接:

    ln -s /etc/init.d/myscript /etc/rc0.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc1.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc6.d/S99myscript 

    然后继续重启,发现脚本依旧没有执行。我们注意到,当我们在0123456都添加了脚本的软连接时,脚本是在开机和关机都被执行了一次的。所以虽然脚本没有执行,但是根据我的经验,我依然对上面标红色的猜测坚定不移。那么下面的问题就是,为什么脚本没有被执行呢?此时我的猜测是:系统不会机械的根据0123456文件夹下面的脚本来执行,而是会自己记录,只有在启动时系统启动过这个脚本,在结束时系统才会去终止这个脚本。那么基于这个猜测,我们的问题进一步转化,脚本都是一样的,系统是如何区别启动和终止的的呢?这时我们不妨再查看一下"/etc/init.d"下面的其他脚本,结果发现很多脚本都会对$1入参做一个case语句,分别对应着start和stop,就拿我们都知道的ssh举例:

    case "$1" in
      start)
            check_privsep_dir
            check_for_no_start
            check_dev_null
            log_daemon_msg "Starting OpenBSD Secure Shell server" "sshd" || true
            if start-stop-daemon --start --quiet --oknodo --pidfile /run/sshd.pid --exec /usr/sbin/sshd -- $SSHD_OPTS; then
                log_end_msg 0 || true
            else
                log_end_msg 1 || true
            fi
            ;;
      stop)
            log_daemon_msg "Stopping OpenBSD Secure Shell server" "sshd" || true
            if start-stop-daemon --stop --quiet --oknodo --pidfile /run/sshd.pid; then
                log_end_msg 0 || true
            else
                log_end_msg 1 || true
            fi
            ;;

    所以基于此,我们可以猜测:系统在启动时执行脚本,会自动在脚本后面传入一个start的入参,在结束时终止脚本,也会调用他,不过在他后面加上一个stop的入参。

    这是我们只要修改一下我们的脚本,加入上面的case语句,让他在start和stop时做不同的事情,然后在重新链接一次:

    rm /etc/rc0.d/S99myscript
    rm /etc/rc1.d/S99myscript
    rm /etc/rc6.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc0.d/K99myscript
    ln -s /etc/init.d/myscript /etc/rc1.d/K99myscript
    ln -s /etc/init.d/myscript /etc/rc2.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc4.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc5.d/S99myscript
    ln -s /etc/init.d/myscript /etc/rc6.d/K99myscript 

    然后此时我们再次重启,这时发现写在start参数和stop参数下面的语句分别被执行了。由此验证了我们上面所有红字的猜测,都是正确的。

    所以假如我们想写一个关机执行的脚本,只要在上面start参数下面什么也不做就可以了。

    说到这里,我们可以从更深层次介绍一下,其实写在"/etc/init.d"下面的就是linux系统的service。service都回在开机时启动,在关机时结束,而启动和结束的方式就是通过传入start或stop参数。比如我们自己写的脚本,还可以在后面加个status的参数,可以看到这service的状态。所以在这里说一下,如果你在关机之前手动调用你的脚本,并且给他传入了stop参数,那么系统关机时将也不再次执行你的脚本。

    好了说了这么多,我们在最后总结一下在一个ubuntu系统添加一个开机和关机脚本的详细步骤:

    (1)在"/etc/init.d"下面创建你要执行的脚本,名字可不同:

    touch /etc/init.d/myscript

    (2)在开头添加以下内容:

    #!/bin/bash
    
    ### BEGIN INIT INFO
    # Provides:
    # Required-Start:
    # Required-Stop:
    # Default-Start:    2 3 4 5
    # Default-Stop:     0 1 6
    # Short-Description:
    # Description:
    ### END INIT INFO

    (3)然后在后面添加执行逻辑,开机逻辑和关机逻辑只需要一种时,另一处可以什么也不添:

    case "$1" in
      start)
            #开机需要执行的逻辑
            ;;
      stop)
            #关机需要执行的逻辑
            ;;
      *)
            ;;
    esac

    (4)保存文件,然后执行:

    update-rc.d myscript defaults

    大功告成!

    展开全文
  • 首先在/etc/init.d目录下先创建一个简单的脚本,名字为服务名testService #!/bin/sh start() { echo"Startingmyprocess">/root/a.txt } stop() { echo"Stop...

    首先在/etc/init.d目录下先创建一个简单的脚本,名字为服务名testService

    #!/bin/sh
    start()
    {
            echo "Starting my process ">/root/a.txt
    }
    stop()
    {
            echo "Stoped">/root/b.txt
    }
    case "$1" in
        start)
            start
            RETVAL=$?
            ;;
        stop)
            stop
            RETVAL=$?
            ;;
        *)
            echo $"Usage: service testService{start|stop}"
            RETVAL=2
            ;;
    esac
    exit $RETVAL

    为了在系统中注册这个服务,需要使用chkconfig命令,并且要在脚本头部加入,后面的17是启动优先级,83是关闭优先级

    # chkconfig: - 17 83

    然后调用chkconfig命令注册该服务

    chkconfig --add testService

    如果想开机启动该服务,则和其他服务一样执行

    chkconfig testService on

    至此,重启后或者开机后,服务脚本里的start段就会执行了,但是关机或重启的时候stop函数并不会执行,查了好久终于找到了,要在启动服务后在/var/lock/subsys目录下创建一个和服务名一样的空文件,因此可以在start段加上一句命令。完整的脚本则变为

    #!/bin/sh
    # chkconfig: - 17 83
    . /etc/rc.d/init.d/functions
    start()
    {
            touch /var/lock/subsys/testService
    #        echo "Starting my process ">/root/a.txt
    #        这里可以添加服务启动时执行的脚本
    }
    stop()
    {
            echo "Stoped">/root/b.txt
    #        这里添加服务停止时需要执行的脚本
    }
    case "$1" in
        start)
            start
            RETVAL=$?
            ;;
        stop)
            stop
            RETVAL=$?
            ;;
        *)
            echo $"Usage: service testService{start|stop}"
            RETVAL=2
            ;;
    esac
    exit $RETVAL

    这样,一个简单的服务脚本就完成并注册好了,不仅可以开机,关机的时候执行一段脚本,同样的我们还可以用把我们自己的程序封装到里面作为服务来启动。

    service testService start
    service testService stop

    如果需要更多的参数,可以自行添加脚本段。就和其他的服务一样来使用。


    转载于:https://my.oschina.net/u/2516965/blog/546197

    展开全文
  • windows开关机自动执行脚本

    千次阅读 2020-01-15 17:05:44
    1.开始——运行——gpedit.msc 2.策略——计算机配置——Windows设置——脚本(启动/关机) 3.右击"关机" 4.添加——浏览:选择脚本确定; 5.完成设置,重启测试。 ...

    1.开始——运行——gpedit.msc
    2.策略——计算机配置——Windows设置——脚本(启动/关机)
    3.右击"关机"
    4.添加——浏览:选择脚本确定;
    5.完成设置,重启测试。
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 客户处有一个挂载目录,必须在关机执行kill 及umount等命令,否则无法关机,尝试过网络上很多方法,都没法实现,知道看到一篇文章,这是原文地址:https://blog.csdn.net/xiaohu50/article/details/79268538 ...

    背景

    客户处有一个挂载目录,必须在关机前执行kill 及umount等命令,否则无法关机,尝试过网络上很多方法,都没法实现,直到看到一篇文章,这是原文地址:https://blog.csdn.net/xiaohu50/article/details/79268538
    ~感谢作者分享

    1.创建你要执行的脚本并赋权

    以创建文件夹为示例,后续可方便查看创建时间检查命令的执行情况

    root@root:~#  vi /home/admintest/mkdirtest.sh
    
    #!/bin/bash
    mkdir /home/admintest/mkdirtest
    ##写上你要执行的命令
    
    chmod 755 /home/admintest/mkdirtest.sh
    

    2.在system目录创建service并赋权

    root@root:~# vi /etc/systemd/system/mkdirtest.service
    
    [Unit]
    Description=Run command at shutdown
    Requires=network.target
    DefaultDependencies=no
    Conflicts=reboot.target
    Before=shutdown.target
    [Service]
    Type=oneshot
    RemainAfterExit=true
    ExecStart=/bin/true
    ExecStop=/bin/sh /home/admintest/mkdirtest.sh
    ##上面写上你的脚本绝对路径
    [Install]
    WantedBy=multi-user.target
    
    root@root:~# chmod 755  /etc/systemd/system/mkdirtest.service
    

    3.重新加载systemd配置

    root@root:~# systemctl daemon-reload
    

    4.链接service使其开机启动

    root@root:~# systemctl enable /etc/systemd/system/mkdirtest.service
    

    5.查看service状态是否为active及检查目录

    root@root:~# systemctl status mkdirtest.service
    

    如图,状态为active为正常
    状态

    root@root:~# ls -l /home/admintest/
    

    查看命令未执行前的目录结构
    目录

    6.重启并记下时间,方便核对

    root@root:~# reboot
    

    重启
    重启

    启动后查看文件是否创建及核对时间

    root@root:~# ls -l /home/admintest/
    

    如图,命令执行了,创建了mkdirtest文件夹
    在这里插入图片描述
    我们谨慎一点,再仔细核对创建时间,是否与关机时间对得上

    root@root:~# stat /home/admintest/mkdirtest
    

    创建时间
    核对重启时间,可以看出文件夹创建是在重启那一瞬间完成的,那么我们也就达到了目的。

    展开全文
  • 关机执行bat脚本

    千次阅读 2019-01-04 09:37:04
    项目需要在电脑关机时,需要自动停止服务,因为服务连接着设备,如果电脑... 如何在关机时候自动执行这个脚本?  使用 组策略: gpedit.msc  注意不要使用 “任务计划程序”, 这个是没有关机动作的    关...
  • 近期客户那边遇到一个问题,iscsi导致无法重启和关闭服务器,经过查询资料,这是一个官方bug,只能在关机或重启前关闭所有的iscsi session。...我的思路是在/lib/systemd/system-shutdown/下面创建一个脚本shutdownbefo
  • ESXI自动关机 ping值检测关机脚本,花了一上午的时间测试关机脚本,在UPS不支持管理的情况下,通过ping某个IP,如 网关或路由器,当ping不通后180秒执行关机脚本,亲测 自动非强制断电的方式关掉虚拟机后再关机ESXI...
  • 1.1 创建所需运行脚本 mkdir /tmp/scripts vim script_run_by_service.sh echo “This is generated when reboot by service” >> mp/scripts/test_service.txt 1.2 添加执行权限 chmod +x script_run_by_...
  • 2.脚本执行成功后桌面右下角会弹出提示框,提示你系统将在你设定的时间后关机 3.定时重启只需将shutdown -s 改为shutdown -r 既可 4.at xx:xx(表示几点几分,24小时制)shutdown -s 表示在你设定的时间关机
  • 1.关机执行某个脚本的具体思路 (1)在文件夹/etc/init.d/下创建关机时需要执行脚本file_name; (2)分别在文件夹/etc/rc0.d/和/etc/rc6.d/下创建该该脚本文件的链接文件K07file_name: sudo ln -s /etc/init.d...
  • 关机执行指定脚本

    千次阅读 2016-12-29 13:39:26
    在.login中执行相应命令,或在.bashrc(用tcsh shell,在.tcshrc)里写命令。是不行的,.login是在用户登录时执行,用户可能在本地无需登录,或者在远程多个用户登录,多次登录;...2、 运行系统内核并检测硬件 3、
  • 自己写的关机脚本

    2018-12-17 19:25:21
    win7 xp 打开后 按F10 自己写的小脚本
  • 自动关机脚本

    2013-10-17 22:42:15
    可以实现自动关机的一个小脚本, 非常简单,但很实用, 注意:把这个小脚本放到Windows系统中的启动当中,让它能够一启动就运行
  • 价值:实时掌握开关机记录;... 1.开始——运行——gpedit.msc2.策略——计算机配置——Windows设置——脚本(启动/关机)3....注:关机脚本启动目录:C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown...
  • Centos7关机和重启前执行自定义脚本

    千次阅读 2019-01-18 00:47:59
    如果你在linux系统上启动了很多自己的服务,如果直接执行系统的reboot或者shutdown命令,可能会发生一些异常的现象,所以我们在重启和关机前,应该按照我们的意愿去自定义清理一些服务或者资源等。但是网上的方式...
  • windows 平台支持 开机自动重启脚本,可以测试100次以上,次数可以自己修改
  • ubuntu设置关机时自动执行任务

    千次阅读 2018-02-06 11:08:04
    什么也不做 ,然后在系统调用shutdown.target的时候,会执行退出操作,就是我们希望的运行脚本 /bin/bash /usr/local/bin/cleanup.sh 。也就达到了我们希望的效果。 然后重新加载systemd配置 sudo systemctl...
  • 3dmax自动关机脚本

    2018-08-06 09:38:05
    max渲染完可自动关机,渲染完自动执行脚本max渲染完可自动关机,渲染完自动执行脚本
  • ESXi加UPS断电自动关机脚本

    千次阅读 2020-12-15 18:24:09
    ESXi加UPS断电自动关机脚本 文章目录ESXi加UPS断电自动关机脚本遇到的问题解决解决思路脚本参考链接 遇到的问题 办公室有的时候会断电,公司的服务器也会随着一起断电,并且断电会损害硬盘。 解决 解决思路 服务器...
  • 自动关机恶搞脚本

    2012-10-12 21:23:38
    可以让执行的电脑自动关机的恶搞脚本。第4行代码的50是关机时间。最后一行代码是中断关机命令。
  • 用途:本程序主要用于带...否则依然执行关机操作! 特别注意: 添加测试主机的时候请添加断电后不能拼通的主机,并且随时开机的主机!尽量不要输入广域网!除非你没有局域网!同一交换机下最合适!请记住交换机不要放UPS上哦!
  • 关机前外挂脚本 powershell通过commandline控制vmware 参考1. 开机自启动这里采用win7自带的任务管理[Task schedule]来完成 1.1 依次打开选择 Computer Management System Tools Task Scheduler Task Scheduler ...
  • 关机执行脚本文件,脚本文件中包含一些命令的说明 使用时只需要修改虚拟机的目录和目标启动机的目录即可
  • 用批处理或Dos添加计划任务和开关机脚本 问题一: 1;开机运行 a) 在 "%USERPROFILE%\「开始」菜单\程序\启动" 文件夹,将每次开机要运行的程序或程序的快捷方式复制到这里. //****************** @echo off...
  • window定时自动关机脚本 .bat批处理脚本 批处理介绍(batch) 批处理(Batch),也称为批处理脚本。它是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,应用于DOS和Windows系统中。批处理文件的扩展名为bat...
  • 运行的状态下需要执行脚本。在这些文件夹下的文件,都是软链文件,指向指定位置的脚本,这些软链都是指向同一个文件夹 /etc/init.d/ 的脚本文件, 载入本机设定 (/etc/rc.d/rc.local) rc.local 文件, ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,900
精华内容 20,360
关键字:

关机执行脚本