控制脚本

#处理信号
    Linux信号
        信 号    值      描 述
        1      SIGHUP    挂起进程
        2      SIGINT    终止进程
        3      SIGQUIT   停止进程
        9      SIGKILL   无条件终止进程
        15     SIGTERM   尽可能终止进程
        17     SIGSTOP   无条件停止进程,但不是终止进程
        18     SIGTSTP   停止或暂停进程,但不终止进程
        19     SIGCONT   继续运行停止的进程
    生成信号
        中断进程(组合键:Ctrl+C,生成信号2)
        暂停进程(组合键:Ctrl+Z,生成信号18)
            $ sleep 100
                ^Z
                [1]+ Stopped sleep 100
            $
            $ ps -l  -- 查看终止的进程
                F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
                0 S 501 2431 2430 0 80 0 - 27118 wait pts/0 00:00:00 bash
                0 T 501 2456 2431 0 80 0 - 25227 signal pts/0 00:00:00 sleep  -- S的状态为T表示暂停的进程
                0 R 501 2458 2431 0 80 0 - 27034 - pts/0 00:00:00 ps
            $
            $ kill -9 2456  -- 通过已知PID发送信号9,无条件终止进程
    捕获信号(trap)
        如何使用 trap 命令来忽略 SIGINT 信号
            #
                trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
            #
                echo This is a test script
            #
                count=1
                while [ $count -le 10 ]
                do
                    echo "Loop #$count"
                    sleep 1
                    count=$[ $count + 1 ]
                done
            #
                echo "This is the end of the test script"
            #
        如何捕获exit退出
            #
                trap "echo Goodbye..." EXIT  -- 当使用Ctrl+C也会获得退出
            #
                count=1
                while [ $count -le 5 ]
                do
                    echo "Loop #$count"
                    sleep 1
                    count=$[ $count + 1 ]
                done
            #
        修改或移除捕获(移除--,恢复-)
            #
                count=1
                while [ $count -le 5 ]
                do
                echo "Loop #$count"
                sleep 1
                count=$[ $count + 1 ]
                done
            #
            # Remove the trap
                trap -- SIGINT    -- 移除捕获之前的脚本是无法被中断的,之后的可以
                echo "I just removed the trap"
            #
                count=1
                while [ $count -le 5 ]
                do
                echo "Second Loop #$count"
                sleep 1
                count=$[ $count + 1 ]
                done
            #
#后台模式
    sleep 10        -- 会话暂停10秒
    sleep 10&   -- 后台等待
    jobs -l            -- 查看进程状态
    (sleep 2 ; echo $BASH_SUBSHELL ; sleep 2)&    -- 将进程列入后台
    coproc(略)-- 协程(前台后台同事运行)
#以后台模式运行脚本
    后台运行脚本,只要在命令后加个 & 符就行了
        sh sw_cs.sh &  -- [1] 3231 , 作业号与PID,进程的PID是唯一的。当后台进程运行时,它仍然会使用终端显示器来显示 STDOUT 和 STDERR 消息
    运行多个后台作业(后台运行过程可以在控制台输入其他命令,互不影响)
    在非控制台下运行脚本(nohup,无法执行sh文件。略)
#作业控制(jobs)
    脚本用 $$ 变量来显示Linux系统分配给该脚本的PID    
    查看作业
        jobs -l  -- 带加号的作业会被当做默认作业 如:
            [1] 1950 Running ./test10.sh > test10a.out &
            [2]- 1952 Running ./test10.sh > test10b.out &
            [3]+ 1955 Running ./test10.sh > test10c.out &  -- 最后一个执行的作为默认作业
    重启停止的作业
        $ bg  -- 加号的后台默认作业将重启。注意不会被列出作业号,完了进程会结束。
        [1]+ ./test11.sh &
        $ bg 2  -- 作业号为2的后台进程重启
        $ fg 2  -- 要以前台模式重启作业,可用带有作业号的 fg 命令
#调整优先级(-20最高,19最低。进程默人从优先级0开始)
    nice命令只能让脚步以更低的优先级运行,只能命令启动时的调度优先级。在运行中不能使用
        $ nice -n 10 ./test4.sh > test4.out & -- -n并不是必须的,可以直接使用 nice -10
        [1] 4973
        $ ps -p 4973 -o pid,ppid,ni,cmd  -- 验证优先级
        PID PPID NI CMD
        4973 4721 10 /bin/bash ./test4.sh
        $
    renice改变系统上已运行命令的优先级,使用和性质和nice差不多。只有root用户才能任意调度优先级,而不是只能降低。
#定时运行作业
    at(略)
    crontab
        格式:min hour dayofmonth month dayofweek command (dayofweek,0代表周日,6代表周六)
        如:00 12 * * * if [ ` date +%d -d tomorrow ` = 01 ] ; then ; command  -- 每天中午12点判断是否是月最后一天,如果是执行
        crontab -l  -- 查询调度任务
    anacron时间表(略。处理系统关机错过的调度)

 

posted on 2019-07-17 10:33  丿星痕☆森文  阅读(134)  评论(0编辑  收藏  举报

导航