• 控制脚本


    #处理信号
        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时间表(略。处理系统关机错过的调度)
    生活就要逢山开路遇水搭桥,愿共勉!
  • 相关阅读:
    STM32(五)固件库文件分析
    STM32(四)GPIO初始化顺序
    STM32(三)GPIO的8种工作模式介绍
    date命令详解
    "System.Security.Cryptography.CryptographicException: 拒绝访问" 问题的解决方法
    记录一次win2003服务器的IIS服务加载.flv后缀的资源报错404的处理方法
    Linux之修改主机名(永久生效)
    Python3 isdigit()方法
    Python3 字典 items() 方法
    Linux shell脚本中shift的用法说明
  • 原文地址:https://www.cnblogs.com/TianMu/p/11199397.html
Copyright © 2020-2023  润新知