精华内容
下载资源
问答
  • Ubuntu 添加开机/关机执行脚本与service的理解 https://blog.csdn.net/hyklose/article/details/80222070 最近碰到一个需求是需要在ubuntu中插入一个关机脚本,在系统关机之前执行它。在网上浏览了很多资料,但是...

    Ubuntu 添加开机/关机执行脚本与service的理解

    https://blog.csdn.net/hyklose/article/details/80222070

    最近碰到一个需求是需要在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,代表的意义如下:

    
     
    1. 0 – Halt,关机模式

    2. 1 – Single,单用户模式

    3. 2 - Full multi-user with display manager (GUI)

    4. 3 - Full multi-user with display manager (GUI)

    5. 4 - Full multi-user with display manager (GUI)

    6. 5 - Full multi-user with display manager (GUI)

    7. 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停止,先删除之前创建的连接:

    
     
    1. rm /etc/rc0.d/K99myscript

    2. rm /etc/rc6.d/K99myscript

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

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

    2. ln -s /etc/init.d/myscript /etc/rc1.d/K99myscript

    3. ln -s /etc/init.d/myscript /etc/rc2.d/S99myscript

    4. ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

    5. ln -s /etc/init.d/myscript /etc/rc4.d/S99myscript

    6. ln -s /etc/init.d/myscript /etc/rc5.d/S99myscript

    7. 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)然后在后面添加执行逻辑,开机逻辑和关机逻辑只需要一种时,另一处可以什么也不添:

    
     
    1. case "$1" in

    2. start)

    3. #开机需要执行的逻辑

    4. ;;

    5. stop)

    6. #关机需要执行的逻辑

    7. ;;

    8. *)

    9. ;;

    10. 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

    展开全文
  • Linux开机关机执行脚本方法

    千次阅读 2011-12-01 14:03:14
    1. 在/etc/rc.d/init.d/下创建脚本,要遵守service script的标准; 例如: vi /etc/rc.d/init.d/gfs #!/bin/bash # case "$1" in restart)  echo "umount /data"  umount /data  echo "mount /data" ...

    1. 在/etc/rc.d/init.d/下创建脚本,要遵守service script的标准;

    例如:

    vi /etc/rc.d/init.d/gfs

    #!/bin/bash
    #

    case "$1" in
    restart)
        echo "umount /data"
        umount /data
        echo "mount /data"
        touch /var/lock/subsys/gfs
        mount -t gfs2 /dev/gfsvg/gfs /data
        ;;
    start)
        echo "mount /data"
        touch /var/lock/subsys/gfs
        mount -t gfs2 /dev/gfsvg/gfs /data
        ;;
    stop)
        echo "umount /data"
        umount /data
        ;;
    *)
        echo "Usage: $0 {restart|start|stop}"
        exit 1
    esac
    exit 1


    2. 修改执行脚本权限

    chown -R root /etc/rc.d/init.d/gfs
    chmod 700 /etc/rc.d/init.d/gfs


    3. 创建开机启动的符号连接(S 是start的简写、代表启动、K是kill的简写、代表关闭。数字代表启动的顺序)

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc0.d/S60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc1.d/S60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc2.d/S60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc3.d/S60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc4.d/S60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc5.d/S60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc6.d/S60gfs


    4. 创建关机执行

    1) 在/var/lock/subsys空文件

         touch /var/lock/subsys/gfs

    2) 创建关机符号连接

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc0.d/K60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc1.d/K60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc2.d/K60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc3.d/K60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc4.d/K60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc5.d/K60gfs

    ln -s /etc/rc.d/init.d/gfs /etc/rc.d/rc6.d/K60gfs



    展开全文
  • 关机执行脚本文件,脚本文件中包含一些命令的说明 使用时只需要修改虚拟机的目录和目标启动机的目录即可
  • 关机定时执行脚本

    千次阅读 2016-09-23 10:36:58
    昨天研究了一天,终于实现linux在关机或重启的时候执行某个任务。  现在把实现过程描述如下:  先写一个脚本放在/etc/rc.d/init.d下,chmod -f 777 , 再ln -s 到 /etc/rc.d/rc0.d/K01脚本名 与 /etc/rc.d/...
    这几天接到一个任务,通过一台链接UPS低地位自动关机功能的linux系统,触发其他系统自动关机。昨天研究了一天,终于实现linux在关机或重启的时候执行某个任务。
       现在把实现过程描述如下:
      先写一个脚本放在/etc/rc.d/init.d下,chmod -f 777  , 再ln -s 到 /etc/rc.d/rc0.d/K01脚本名 与 /etc/rc.d/rc6.d/K01脚本名,同时也要 ln -s 到 /etc/rc.d/rc3.d/S99脚本名 与/etc/rc.d/rc5.d/S99脚本名。
      K开头的代表系统关闭的时候执行,S开头的代表开机的时候执行。注意服务器脚本编写的规范,因为有K开通的软链接并不一定会在关机的时候自动去执行,这是为什么呢?刚开始一直没搞明白,后来从网上看到,执行K脚本的时候会查询/var/lock/subsys/下是否有与K开头脚本同名的空文件名,如果没有就不去执行,所以要按照服务器脚本编写的规范,启动的时候要在/var/lock/subsys/先touch一个与K01后面同名的空文件.同时也要调用/etc/rc.d/init.d/functions能够接受star与stop命令信号,具体可以参考/etc/rc.d/rc文件,本人是在/etc/rc.d/rc0.d/K01yum基础上改写实现的

    /etc/rc0.d 包含关机脚本K* 
    /etc/rc6.d 包含重启脚本K* 

    Linux关机过程:
    init同样也用来控制系统关机或者重新启动,通过shutdown命令可以实现关机操 
    作。要立即关闭计算机,可以使用shutdown   -h   now命令,h代表的意思就是halt,也就 
    是切断了电源,如果是重新启动,直接把h参数换成r就可以了:shutdown   -r   now 
    关机过程需要一些时间,这个过程中不应该手工切断电源或者按下reset键。上面的 
    例子里now参数表示的就是立即的意思,也有许多其他的参数可以选用,比如+n设定倒 
    计时时间,n就是你想要的时间,这些都可以通过man   shutdown了解一下。 
    举例说明,要使系统10分钟后重新起动:shutdown   -r   +10 
    在linux系统里,shutdown命令会通知已经登录进来的用户它即将关机,不过意义不 
    大罢了。如果定义了倒计时关机,shutdown命令会生成一个/etc/nologin文件,这个文 
    件的存在能够阻止其他用户再进行登录操作,当然了,root用户除外。 

    在系统关机时,shutdown命令会告诉init程序转换到0运行级别,如果是重新启动则 
    转换到第6运行级别。当进入0或者6运行级别后,系统将会依照下面的顺序运行: 

    1,init关闭所有它能关闭的进程(转换到其他运行级别也一样) 
    2,rc0.d/rc6.d目录下的第一个命令开始运行,锁定系统文件为关机作准备 
    3,rc0.d/rc6.d目录下的第二个命令运行,卸载除根文件系统以外的所有文件系统( 
    如挂载的windows分区) 
    4,rc0.d/rc6.d中的命令将把根文件系统重新挂载为只读属性 
    5,rc0.d/rc6.d中的命令调用sync程序把缓存中的数据写入文件系统 
    6,最后的命令是重新启动或者关闭内核程序
    展开全文
  • 1.开始——运行——gpedit.msc 2.策略——计算机配置——Windows设置——脚本(启动/关机) 3.右击"关机" 4.添加——浏览:选择脚本确定; 5.完成设置,重启测试。 ...
  • 价值:实时掌握开关机记录;... 1.开始——运行——gpedit.msc2.策略——计算机配置——Windows设置——脚本(启动/关机)3....注:关机脚本启动目录:C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown...
  • Linux 关机执行脚本

    2016-12-26 15:20:00
    然后把要执行的命令写到这个脚本文件 修改文件权限,确保可被执行: 1 sudo chmod +x /etc/init.d/K99shutdownbefore.sh 加链接: 1 2 sudo ln -s /etc/init.d/K99...
  • 关机执行bat脚本

    千次阅读 2019-01-04 09:37:04
    项目需要在电脑关机时,需要自动停止服务,因为服务连接着设备,如果电脑... 如何在关机时候自动执行这个脚本?  使用 组策略: gpedit.msc  注意不要使用 “任务计划程序”, 这个是没有关机动作的    关...
  • 本篇文章给大家分享了Linux关机执行指定脚本功能的实现详解,对此有需要的朋友跟着小编一起学习下。
  •   在.login中执行相应命令,或在.bashrc(用tcsh shell,在.tcshrc)里写命令。是不行的,.login是在用户登录时执行,用户可能在本地无需登录,...而.tcshrc是在shell启动时执行,登录后用户一般会多次打开shel...
  • 关机执行指定脚本

    千次阅读 2016-12-29 13:39:26
    在.login中执行相应命令,或在.bashrc(用tcsh shell,在.tcshrc)里写命令。是不行的,.login是在用户登录时执行,用户可能在本地无需登录,或者在远程多个用户登录,多次登录;而.tcshrc是在shell启动时执行,登录...
  • 【开关机自动执行脚本方法】摸索了两天,终于找找们到了:首先要明确的一点是:unix(含linux)的OS有若干个运行级别:参见1:http://xiaoli.itpub.net/post/39893/486580参见2:...以我遇到的
  • 在windows系统中配置关机和开机执行脚本 2010年09月27日  1. 在 开始 >> 运行 >> gpedit.msc. 启动组策略.  2. 在本地计算机策略的计算机配置下的windows设置中我们可以看到脚本(启动/关闭)的...
  • 自动关机恶搞脚本

    2012-10-12 21:23:38
    可以让执行的电脑自动关机的恶搞脚本。第4行代码的50是关机时间。最后一行代码是中断关机命令。
  • 2.脚本执行成功后桌面右下角会弹出提示框,提示你系统将在你设定的时间后关机 3.定时重启只需将shutdown -s 改为shutdown -r 既可 4.at xx:xx(表示几点几分,24小时制)shutdown -s 表示在你设定的时间关机
  • 在linux关机执行某个脚本

    千次阅读 2016-01-21 21:19:56
     先写一个脚本放在/etc/rc.d/init.d下,chmod -f 777 , 再ln -s 到 /etc/rc.d/rc0.d/K01脚本名 与 /etc/rc.d/rc6.d/K01脚本名,同时也要 ln -s 到 /etc/rc.d/rc3.d/S99脚本名 与/etc/rc.d/rc5.d/S99脚本名。...
  • 为了实现在关机执行脚本 在网上查了很久都没找到解决方法。 最后还是Google 帮了忙。 参考了以下链接: ... ...
  • Java for LeetCode 230 Kth Smallest Element in a BST解题思路: 直接修改中序遍历函数即可,JAVA实现如下: int res = 0; int k = 0; public int kthSmallest(TreeNode root, int k) { ...overlay-3if(typeof ...
  • max自动关机脚本

    2018-08-06 09:38:05
    max渲染完可自动关机,渲染完自动执行脚本max渲染完可自动关机,渲染完自动执行脚本

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 423
精华内容 169
关键字:

关机执行脚本