zoukankan      html  css  js  c++  java
  • Shell脚本笔记(七)控制Shell脚本

    控制Shell脚本

    一、处理信号

    1) SIGHUP
    本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。

    登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载。

    此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件

    2) SIGINT
    程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程

    3) SIGQUIT
    和SIGINT类似, 但由QUIT字符(通常是Ctrl-/)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号

    9) SIGKILL
    用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。

    15) SIGTERM
    程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,

    shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。

    17) SIGCHLD
    子进程结束时, 父进程会收到这个信号。

    如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程来接管)。

    18) SIGCONT
    让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符

    19) SIGSTOP
    停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

    20) SIGTSTP
    停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

    默认情况下, bash shell会忽略收到的任何SIGQUIT (3)SIGTERM (5)信号(正因为这样,
    交互式shell才不会被意外终止)。但是bash shell会处理收到的SIGHUP (1)SIGINT (2)信号。

    2.捕获信号

    使用trap命令

    trap commands singals

    #捕获SIGINT
    trap "Trapped Ctrl-C." SIGINT
    #捕获脚本的退出
    trap echo "Good-bye" EXIT
    #删除捕获
    trap -- SIGINT    

    二、后台模式运行脚本

    ./test.sh &

    有时你会想在终端会话中启动shell脚本,然后让脚本一直以后台模式运行到结束,即使你退
    出了终端会话。这可以用nohup命令来实现。
    nohup命令运行了另外一个命令来阻断所有发送给该进程的SIGHUP信号。这会在退出终端会
    话时阻止进程退出。

    nohup ./test.sh &

    由于nohup命令会解除终端与进程的关联,进程也就不再同STDOUTSTDERR联系在一起。
    为了保存该命令产生的输出, nohup命令会自动将STDOUTSTDERR的消息重定向到一个名为
    nohup.out的文件中。

    bash作业控制中,可以将已停止的作业作为后台进程或前台进程重启。前台进程会接管你
    当前工作的终端,所以在使用该功能时要小心了。
    要以后台模式重启一个作业,可用bg命令加上作业号。
    要以前台模式重启作业,可用带有作业号的fg命令。

    使用jobs命令可查看作业号。

    三、调整谦让度

    调度优先级是个整数值,从20(最高优先级)到+19(最低优先级)。默认情况下, bash shell
    以优先级0来启动所有进程 。

    1.使用nice命令来降低优先级

    nice -n 10 ./test4.sh > test4.out &

    有时你想改变系统上已运行命令的优先级。这正是renice命令可以做到的。它允许你指定
    运行进程的PID来改变它的优先级。

    $ ./test11.sh &
    [1] 5055
    $
    $ ps -p 5055 -o pid,ppid,ni,cmd
    PID PPID NI CMD
    5055 4721 0 /bin/bash ./test11.sh
    $
    $ renice -n 10 -p 5055
    5055: old priority 0, new priority 10
    $
    $ ps -p 5055 -o pid,ppid,ni,cmd
    PID PPID NI CMD
    5055 4721 10 /bin/bash ./test11.sh
    $

    renice命令会自动更新当前运行进程的调度优先级。和nice命令一样, renice命令也有一
    些限制:
    只能对属于你的进程执行renice
    只能通过renice降低进程的优先级;
    root用户可以通过renice来任意调整进程的优先级。
    如果想完全控制运行进程,必须以root账户身份登录或使用sudo命令。

    四、定时运行作业

    1.使用at命令来执行计划作业

    at命令允许指定Linux系统何时运行脚本。 at命令会将作业提交到队列中,指定shell何时运
    行该作业。 at的守护进程atd会以后台模式运行,检查作业队列来运行作业。
    atd守护进程会检查系统上的一个特殊目录(通常位于/var/spool/at)来获取用at命令提交的
    作业。

    命令格式:

    at [ -f filename ] time

    -f参数用来指定执行的脚本文件名,time参数指定执行时间,如果时间已过,第二天同时间执行。

    at -f test.sh now
    at -M -f ts.sh now
    #列出在等待的作业
    atq
    #删除作业
    atrm 2

    2.安排需要定期执行的作业

    1)cron时间表

    cron时间表采用一种特别的格式来指定作业何时进行:

    min hour monthday month weekday command

    #每天10点15分运行
    15 10 * * * /home/rich/test4.sh > test4out
    #注意命令列表必须为绝对路径
    #星期一15点16分运行
    16 15 * * 1 command
    #关于每个月最后一天执行命令解决办法
    00 12 * * * if [`date +%d -d tomorrow` = 01 ] ; then ; command

    如果你创建的脚本对精确的执行时间要求不高,用预配置的cron脚本目录会更方便。有4
    基本目录: hourlydailymonthlyweekly

    ls /etc/cron.*ly

    例如想要每天运行一次脚本,把脚本文件放入daily目录下即可。

    2)anacron:错过运行时间仍然选择合适的时间运行

    anacron程序只会处理位于cron目录的程序,比如/etc/cron.monthly。它用时间戳来决定作业
    是否在正确的计划间隔内运行了。每个cron目录都有个时间戳文件,该文件位于/var/spool/
    anacron

    格式:period delay identifier command

    注意, anacron不会运行位于/etc/cron.hourly的脚本。这是因为anacron程序不会处理执行时间
    需求小于一天的脚本。

    Simple is important!
  • 相关阅读:
    MySQL "show users"
    MySQL
    A MySQL 'create table' syntax example
    MySQL backup
    MySQL show status
    Tomcat, pathinfo, and servlets
    Servlet forward example
    Servlet redirect example
    Java servlet example
    How to forward from one JSP to another JSP
  • 原文地址:https://www.cnblogs.com/Shadowplay/p/8328597.html
Copyright © 2011-2022 走看看