shell脚本基础之详解脚本的控制

  • 目前,我们运行脚本的唯一方式就是以实时模式在命令行界面上直接运行。但这并不是Linux上运行脚本的唯一方式。有不少方法可以用来运行shell脚本。另外还有一些选项能够用于控制脚本。这些控制方法包括向脚本发送信号、修改脚本的优先级以及在脚本运行时切换到运行模式,下面都会一一介绍

信号的处理

  • Linux利用信号与运行在系统中的进程进行通信。Linux利用这些信号来停止、启动、终止进程。可以通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作

Linux信号

  • Linux系统和应用程序可以生成超过30个信号。如下表列出了在Linux编程时会遇到的最常见的Linux系统信号
信 号描 述
1SIGHUP挂起进程
2SIGINT终止进程
3SIGQUIT停止进程
9SIGKILL无条件终止进程
15SIGTERM尽可能终止进程
17SIGSTOP无条件停止进程,但不是终止进程
18SIGTSTP停止或暂停进程,但不终止进程
19SIGCONT继续运行停止的进程
  • 默认情况下,bash shell会忽略收到的任何SIGQUIT (3)和SIGTERM (5)信号(正因为如此,交互式shell才不会被意外终止)。但是bash shell会处理收到的SIGHUP (1)和SIGINT (2)信号
  • 如果bash shell收到了SIGHUP信号,比如当我们要离开一个交互式shell,它就会退出。但在退出之前,它会将SIGHUP信号传给所有由该shell所启动的进程(包括正在运行的shell脚本)
  • 通过SIGINT信号,可以中断shell。Linux内核会停止为shell分配CPU处理时间。这种情况发生时,shell会将SIGINT信号传给所有由它所启动的进程,以此告知出现的状况。shell会将这些信号传给shell脚本程序来处理。而shell脚本的默认行为是忽略这些信号。它们可能会不利于脚本的运行。要避免这种情况,可以脚本中加入识别信号的代码,并执行命令来处理信号

生成信号

  • bash shell允许用键盘上的组合键生成两种基本的Linux信号。这个特性在需要停止或暂停失控程序时非常方便
中断进程
  • Ctrl+C组合键会生成SIGINT信号,并将其发送给当前在shell中运行的所有进程。可以运行一条需要很长时间才能完成的命令,然后按下Ctrl+C组合键来测试它,如下:
sleep 99

在这里插入图片描述

  • Ctrl+C组合键会发送SIGINT信号,停止shell中当前运行的进程。sleep命令会使得shell暂停指定的秒数,命令提示符直到计时器超时才会返回。在超时前按下Ctrl+C组合键,就可以提前终止sleep命令
暂停进程
  • 我们可以在进程运行期间暂停进程,而无需终止它。尽管有时这可能会比较危险(比如,脚本打开了一个关键的系统文件的文件锁),但通常它可以在不终止进程的情况下使我们能够深入脚本内部一窥究竟

  • 当用Ctrl+Z组合键时,shell会通知我们进程已经被停止了,如下:
    在这里插入图片描述

  • 方括号中的数字是shell分配的作业号(job number)。shell将shell中运行的每个进程称为作业,并为每个作业分配唯一的作业号。它会给第一个作业分配作业号1,第二个作业号2,以此类推

  • 假如当前的shell会话中有一个已停止的作业,在退出shell时,bash也会提醒你,如下:
    在这里插入图片描述

  • 可以用ps命令来查看已停止的作业
    在这里插入图片描述

  • 在S列中(进程状态),ps命令将已停止作业的状态为显示为T。这说明命令要么被跟踪,要么被停止了。如果在有已停止作业存在的情况下,仍旧想退出shell,只要再输入一遍exit命令就行了。shell会退出,终止已停止作业。或者,既然已经知道了已停止作业的PID,就可以用kill命令来发送一个SIGKILL信号来终止它,如下:
    在这里插入图片描述

  • 在终止作业时,最开始不会得到任何回应。但下次如果我们做了能够产生shell提示符的操作(比如按回车键),就会看到一条消息,显示作业已经被终止了。每当shell产生一个提示符时,它就会显示shell中状态发生改变的作业的状态。在终止一个作业后,下次强制shell生成一个提示符时,shell会显示一条消息,说明作业在运行时被终止了

捕获信号

  • 在脚本也可以不忽略信号,在信号出现时捕获它们并执行其他命令。trap命令允许指定shell脚本要监看并从shell中拦截的Linux信号。如果脚本收到了trap命令中列出的信号,该信号不再由shell处理,而是交由本地处理,trap命令的格式如下:
trap commands signals
  • 在trap命令行上,只要列出想要shell执行的命令,以及一组用空格分开的待捕获的信号。你可以用数值或Linux信号名来指定信号
  • 如下举例,展示如何使用trap命令来忽略SIGINT信号,并控制脚本的行为
#!/bin/bash

trap "echo 'Ctrl+C已被禁止!!'" SIGINT

echo "开始测试!!"

count=1
while [ $count -le 10 ]
do
        echo "循环第$count次!"
        sleep 1
        count=$[ $count + 1 ]
done

在这里插入图片描述

  • 每次使用Ctrl+C组合键,脚本都会执行trap命令中指定的echo语句,而不是处理该信号并允许shell停止该脚本

捕获脚本退出

  • 除了在shell脚本中捕获信号,还可以在shell脚本退出时进行捕获。这是在shell完成任务时执行命令的一种简便方法。要捕获shell脚本的退出,只要在trap命令后加上EXIT信号就行,如下:
#!/bin/bash

trap "echo 再见!!" EXIT

count=1
while [ $count -le 5 ]
do
        echo "输出:$count"
        sleep 1
        count=$[ $count + 1]
done

在这里插入图片描述

  • 当脚本运行到正常的退出位置时,捕获就被触发了,shell会执行在trap命令行指定的命令。如果提前退出脚本,同样能够捕获到EXIT,如下:
    在这里插入图片描述
  • 因为SIGINT信号并没有出现在trap命令的捕获列表中,当按下Ctrl+C组合键发送SIGINT信
    号时,脚本就退出了。但在脚本退出前捕获到了EXIT,于是shell执行了trap命令

修改或移除捕获

  • 要想在脚本中的不同位置进行不同的捕获处理,只需重新使用带有新选项的trap命令,修改了信号捕获之后,脚本处理信号的方式就会发生变化。但如果一个信号是在捕获被修改前接收到的,那么脚本仍然会根据最初的trap命令进行处理,如下:
#!/bin/bash
trap "echo '第一次捕获SIGINT'" SIGINT

count=1
while [ $count -le 5 ]
do
        echo "第一个循环:$count"
        sleep 1
        count=$[ $count + 1 ]
done

trap "echo '第二次捕获SIGINT'" SIGINT

count=1
while [ $count -le 5 ]
do
        echo "第二个循环:$count"
        sleep 1
        count=$[ $count + 1 ]
done

在这里插入图片描述

  • 也可以删除已设置好的捕获。只需要在trap命令与希望恢复默认行为的信号列表之间加上
    两个破折号就行了,如下:
#!/bin/bash
trap "echo '第一次捕获SIGINT'" SIGINT

count=1
while [ $count -le 5 ]
do
        echo "第一个循环:$count"
        sleep 1
        count=$[ $count + 1 ]
done

trap -- SIGINT

count=1
while [ $count -le 5 ]
do
        echo "第二个循环:$count"
        sleep 1
        count=$[ $count + 1 ]
done

在这里插入图片描述

  • 注意:也可以在trap命令后使用单破折号来恢复信号的默认行为。单破折号和双破折号都可以正常发挥作用
  • 移除信号捕获后,脚本按照默认行为来处理SIGINT信号,也就是终止脚本运行。但如果信号是在捕获被移除前接收到的,那么脚本会按照原先trap命令中的设置进行处理,在上例中,第一个Ctrl+C组合键用于提前终止脚本。因为信号在捕获被移除前已经接收到了,脚本会照旧执行trap中指定的命令。捕获随后被移除,再按Ctrl+C就能够提前终止脚本了

以后台模式运行脚本

  • 直接在命令行界面运行shell脚本有时不怎么方便。一些脚本可能要执行很长一段时间,而我们可能并不想在命令行界面一直干等着。当脚本在运行时,又没法在终端会话里做别的事情。幸好有个简单的方法可以解决
  • 使用ps命令时,可以看到运行在Linux系统上的一系列不同进程。显然,所有这些进程都不是运行在终端显示器上的。这样的进程被称为在后台(background)运行进程。在后台模式中,进程运行时不会和终端会话上的STDIN、STDOUT以及STDERR关联,也可以在shell脚本中使用这个特性,允许它们在后台运行而不用占用终端会话

后台运行脚本

  • 后台模式运行shell脚本非常简单。只需在运行命令后加个&符即可,如下:
#!/bin/bash

count=1
while [ $count -le 10 ]
do
        sleep 1
        count=$[ $count + 1]
done

在这里插入图片描述

  • 当&符放到命令后时,它会将命令和bash shell分离开来,将命令作为系统中的一个独立的后台进程运行。显示的第一行是:
[1] 40708
  • 方括号中的数字是shell分配给后台进程的作业号。另一个数是Linux系统分配给进程的进程ID(PID)。Linux系统上运行的每个进程都必须有一个唯一的PID
  • 一旦系统显示了这些内容,新的命令行界面提示符就出现了。可以回到shell,而所执行的命令正在以后台模式安全的运行。这时,可以在提示符输入新的命令,当后台进程结束时,它会在终端上显示出一条消息:
    在这里插入图片描述
  • 这表明了作业的作业号以及作业状态(Done),还有用于启动作业的命令
  • 注意,当后台进程运行时,它仍然会使用终端显示器来显示STDOUT和STDERR消息,如下:
    在这里插入图片描述
  • 我注意到在上面的例子中,脚本test01.sh的输出与shell提示符混杂在了一起,这也是为什么输出会出现在提示符旁边的原因,但是在显示输出的同时,我们仍然可以运行其它命令,如下:
    在这里插入图片描述
  • 当脚本test01.sh运行在后台模式时,我们输入了命令ls 。脚本输出、输入的命令以及命令输出全都混在了一起。真是让人看得头晕!最好是将后台运行的脚本的STDOUT和STDERR进行重定向,避免这种杂乱的输出

运行多个后台脚本

  • 可以在命令行提示符下同时启动多个后台脚本,如下:
    在这里插入图片描述
  • 每次启动新作业时,Linux系统都会为其分配一个新的作业号和PID。通过ps命令,可以看到所有脚本处于运行状态,如下:
    在这里插入图片描述
  • 在终端会话中使用后台进程时一定要小心。注意,在ps命令的输出中,每一个后台进程都和终端会话(pts/0)终端联系在一起。如果终端会话退出,那么后台进程也会随之退出
  • 注意当要退出终端会话时,要是存在被停止的进程,会出现警告信息。但如果使用了后台进程,只有某些终端仿真器会在退出终端会话前提醒还有后台作业在运行

在非控制台下运行脚本

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

在这里插入图片描述

  • 和普通后台进程一样,shell会给命令分配一个作业号,Linux系统会为其分配一个PID号。区别在于,当使用nohup命令时,如果关闭该会话,脚本会忽略终端会话发过来的SIGHUP信号
  • 由于nohup命令会解除终端与进程的关联,进程也就不再同STDOUT和STDERR联系在一起。为了保存该命令产生的输出,nohup命令会自动将STDOUT和STDERR的消息重定向到一个名为nohup.out的文件中
  • 注意:如果使用nohup运行了另一个命令,该命令的输出会被追加到已有的nohup.out文件中。当运行位于同一个目录中的多个命令时一定要注意,因为所有的输出都会被发送到同一个nohup.out文件中,结果会让人感到奇怪!!
  • nohup.out文件包含了通常会发送到终端显示器上的所有输出。在进程完成运行后,可以查看nohup.out文件中的输出结果,如下:
    在这里插入图片描述
  • 输出会出现在nohup.out文件中,就跟进程在命令行下运行时一样

作业控制

  • 在之前的学习中,我们已经知道了如何用组合键停止shell中正在运行的作业。在作业停止后,Linux系统会让我们选择是终止还是重启。可以用kill命令终止该进程。要重启停止的进程需要向其发送一个SIGCONT信号,启动、停止、终止以及恢复作业的这些功能统称为作业控制。通过作业控制,就能完全控制shell环境中所有进程的运行方式

查看作业

作业控制中的关键命令是jobs命令。jobs命令允许查看shell当前正在处理的作业,如下:

#!/bin/bash

echo "进程ID:$$"
count=1
while [ $count -le 10 ]
do
        echo "#LOOP:$count"
        sleep 10
        count=$[ $count + 1 ]
done

echo "运行结束!!"
  • 脚本用$$变量来显示Linux系统分配给该脚本的PID,然后进入循环,每次迭代都休眠10秒,可以从命令行中启动脚本,然后使用Ctrl+Z组合键来停止脚本
    在这里插入图片描述

  • 使用同样的脚本,利用&将另外一个作业作为后台进程启动。将脚本的输出被重定向到文件中,避免出现在屏幕上,如下:
    在这里插入图片描述

  • jobs命令可以查看分配给shell的作业。jobs命令会显示这两个已停止/运行中的作业,以及它们的作业号和作业中使用的命令,如下:
    在这里插入图片描述

  • 要想查看作业的PID,可以在jobs命令中加入-l选项(小写的L),如下:
    在这里插入图片描述

  • jobs命令使用一些不同的命令行参数,如下表:

参数描 述
-l列出进程的PID以及作业号
-n只列出上次shell发出的通知后改变了状态的作业
-p只列出作业的PID
-r只列出运行中的作业
-s只列出已停止的作业
  • 在jobs命令输出中的加号和减号。带加号的作业会被当做默认作业。在使用作业控制命令时,如果未在命令行指定任何作业号,该作业会被当成作业控制命令的操作对象
  • 当前的默认作业完成处理后,带减号的作业成为下一个默认作业。任何时候都只有一个带加号的作业和一个带减号的作业,不管shell中有多少个正在运行的作业
  • 下面例子说明了队列中的下一个作业在默认作业移除时是如何成为默认作业的。有3个独立的进程在后台被启动。jobs命令显示出了这些进程、进程的PID及其状态。注意,默认进程(带有加号的那个)是最后启动的那个进程,也就是3号作业
    在这里插入图片描述
  • 调用了kill命令向默认进程发送了一个SIGHUP信号,终止了该作业。在接下来的jobs
    命令输出中,先前带有减号的作业成了现在的默认作业,减号也变成了加号

在这里插入图片描述

在这里插入图片描述

重启停止的作业

  • 在bash作业控制中,可以将已停止的作业作为后台进程或前台进程重启。前台进程会接管当前工作的终端,所以在使用该功能时要注意。要以后台模式重启一个作业,可用bg命令加上作业号,如下:
    在这里插入图片描述
  • 因为该作业是默认作业(从加号可以看出),只需要使用bg命令就可以将其以后台模式重启。注意,当作业被转入后台模式时,并不会列出其PID。如果有多个作业,你得在bg命令后加上作业号
    在这里插入图片描述
  • 命令bg 2用于将第二个作业置于后台模式。注意,当使用jobs命令时,它列出了作业及其状态,即便是默认作业当前并未处于后台模式
  • 要以前台模式重启作业,可用带有作业号的fg命令
    在这里插入图片描述
  • 由于作业是以前台模式运行的,直到该作业完成后,命令行界面的提示符才会出现

调整谦让度

  • 在多任务操作系统中(Linux就是),内核负责将CPU时间分配给系统上运行的每个进程。调度优先级(scheduling priority)是内核分配给进程的CPU时间(相对于其他进程)。在Linux系统中,由shell启动的所有进程的调度优先级默认都是相同的
  • 调度优先级是个整数值,从-20(最高优先级)到+19(最低优先级)。默认情况下,bash shell以优先级0来启动所有进程
nice命令
  • 想要改变一个shell脚本的优先级。不管是降低它的优先级(这样它就不会从占用其他进程过多的处理能力),还是给予它更高的优先级(这样它就能获得更多的处理时间),都可以通过nice命令做到,nice命令允许设置命令启动时的调度优先级。要让命令以更低的优先级运行,只要用nice的-n命令行来指定新的优先级级别,如下:
    在这里插入图片描述

  • 注意,必须将nice命令和要启动的命令放在同一行中。ps命令的输出验证了谦让度值(NI列)已经被调整到了10

  • nice命令会阻止普通系统用户来提高命令的优先级。但是,指定的作业的确可以运行,试图使用nice命令提高其优先级的操作是失败的

  • nice命令的n选项并不是必须的,只需要在破折号后面跟上优先级也可以,如下:
    在这里插入图片描述

renice命令
  • 有时我们想要改变系统上已运行命令的优先级。这正是renice命令可以做到的。它允许指定运行进程的PID来改变它的优先级,如下:
    在这里插入图片描述
  • renice命令会自动更新当前运行进程的调度优先级。和nice命令一样,renice命令也有一
    些限制:
    • 只能对属于你的进程执行renice
    • 只能通过renice降低进程的优先级
    • root用户可以通过renice来任意调整进程的优先级
  • 如果想完全控制运行进程,必须以root账户身份登录或使用sudo命令

定时运行作业

  • 当开始使用脚本时,可能会想要在某个预设时间运行脚本,这通常是在不在场的时候。Linux系统提供了多个在预选时间运行脚本的方法:at命令和cron表。每个方法都使用不同的技术来安排脚本的运行时间和频率

用 at 命令来定时执行作业

  • at命令允许指定Linux系统何时运行脚本。at命令会将作业提交到队列中,指定shell何时运行该作业。at的守护进程atd会以后台模式运行,检查作业队列来运行作业。大多数Linux发行版会在启动时运行此守护进程
  • atd守护进程会检查系统上的一个特殊目录(通常位于/var/spool/at)来获取用at命令提交的作业。默认情况下,atd守护进程会每60秒检查一下这个目录。有作业时,atd守护进程会检查作业设置运行的时间。如果时间跟当前时间匹配,atd守护进程就会运行此作业
at命令格式
  • at命令的基本格式如下:
at [-f filename] time
  • 默认情况下,at命令会将STDIN的输入放到队列中。可以用-f参数来指定用于读取命令(脚本文件)的文件名,time参数指定了Linux系统何时运行该作业。如果指定的时间已经错过,at命令会在第二天的那个时间运行指定的作业
  • 在如何指定时间这个问题上,Linux是非常灵活的。at命令能识别多种不同的时间格式,如下:
    • 标准的小时和分钟格式,比如10:15
    • AM/PM指示符,比如10:15 PM
    • 特定可命名时间,比如now、noon、midnight或者teatime(4 PM)
  • 除了指定运行作业的时间,也可以通过不同的日期格式指定特定的日期,如下:
    • 标准日期格式,比如MMDDYY、MM/DD/YY或DD.MM.YY
    • 文本日期,比如Jul 4或Dec 25,加不加年份均可
    • 还可以指定时间增量
      • 当前时间+25 min
      • 明天10:15 PM
      • 10:15+7天
  • 在使用at命令时,该作业会被提交到作业队列(job queue)。作业队列会保存通过at命令提交的待处理的作业。针对不同优先级,存在26种不同的作业队列。作业队列通常用小写字母a~z和大写字母A~Z来指代
  • 作业队列的字母排序越高,作业运行的优先级就越低(更高的nice值)。默认情况下,at的作业会被提交到a作业队列。如果想以更高优先级运行作业,可以用-q参数指定不同的队列字母
获取作业输出
  • 当作业在Linux系统上运行时,显示器并不会关联到该作业。取而代之的是,Linux系统会将提交该作业的用户的电子邮件地址作为STDOUT和STDERR。任何发到STDOUT或STDERR的输出都会通过邮件系统发送给该用户

  • 使用e-mail作为at命令的输出极其不便,因此在使用at命令时,最好在脚本中对STDOUT与STDERR进行重定向
    在这里插入图片描述

  • at命令会显示分配给作业的作业号以及为作业安排的运行时间。-f选项指明使用哪个脚本文件,now指示at命令立刻执行该脚本,如果不想在at命令中使用邮件或重定向,最好加上-M选项来屏蔽作业产生的输出信息,如下:

#!/bin/bash

echo "脚本运行时间:$(date +%B%d,%T)" > test03.out
echo >> test03.out
sleep 5
echo "运行结束" >> test03.out

在这里插入图片描述

列出等待的作业
  • atq命令可以查看系统中有哪些作业在等待,如下:
    在这里插入图片描述
  • 作业列表中显示了作业号、系统运行该作业的日期和时间及其所在的作业队列
删除作业
  • 知道了哪些作业在作业队列中等待,就能用atrm命令来删除等待中的作业,如下:
    在这里插入图片描述
  • 只要指定想要删除的作业号即可。只能删除自己提交的作业,不能删除其他人的

安排需要定期执行的脚本

  • 用at命令在预设时间安排脚本执行非常好用,但如果需要脚本在每天的同一时间运行或是每周一次、每月一次呢?用不着再使用at不断提交作业了,可以利用Linux系统的另一个功能
  • Linux系统使用cron程序来安排要定期执行的作业。cron程序会在后台运行并检查一个特殊的表(被称作cron时间表),以获知已安排执行的作业
cron时间表
  • cron时间表采用一种特别的格式来指定作业何时运行。其格式如下:
min hour dayofmonth month dayofweek command
  • cron时间表允许你用特定值、取值范围(比如1~5)或者是通配符(星号)来指定条目。例如,如果想在每天的10:15运行一个命令,可以用cron时间表条目:
15 10 * * * command
  • 在dayofmonth、month以及dayofweek字段中使用了通配符,表明cron会在每个月每天的10:15执行该命令。要指定在每周一4:15 PM运行的命令,如下:
15 16 * * 1 command
  • 可以用三字符的文本值(mon、tue、wed、thu、fri、sat、sun)或数值(0为周日,6为周六)来指定dayofweek表项
  • 在每个月的第一天中午12点执行命令,dayofmonth表项指定月份中的日期值1~31如下 :
00 12 1 * * command
  • 命令列表必须指定要运行的命令或脚本的全路径名。可以像在普通的命令行中那样,添加
    任何想要的命令行参数和重定向符号,如下:
15 10 * * * /home/rich/test4.sh > test4out 
  • cron程序会用提交作业的用户账户运行该脚本。因此,必须有访问该命令和命令中指定的输出文件的权限
注意:
  • 问:如何设置一个在每个月的最后一天执行的命令,因为无法设置dayofmonth的值来涵盖所有的月份
  • 答:常用的方法是加一条使用date命令的if-then语句来检查明天的日期是不是01,如下:
00 12 * * * if [`date +%d -d tomorrow` = 01 ] ; then ; command
  • 它会在每天中午12点来检查是不是当月的最后一天,如果是,cron将会运行该命令
构建cron时间表
  • 每个系统用户(包括root用户)都可以用自己的cron时间表来运行安排好的任务。Linux提供了crontab命令来处理cron时间表。要列出已有的cron时间表,可以用-l选项,如下:
    在这里插入图片描述

  • 默认情况下,用户的cron时间表文件并不存在。要为cron时间表添加条目,可以用-e选项。在添加条目时,crontab命令会启用一个文本编辑器,使用已有的cron时间表作为文件内容(或者是一个空文件,如果时间表不存在的话)

浏览cron目录
  • 如果对创建的脚本对精确的执行时间要求不高,用预配置的cron脚本目录会更方便。有4个基本目录:hourly、daily、monthly和weekly,如下:
    在这里插入图片描述
  • 因此,如果脚本需要每天运行一次,只要将脚本复制到daily目录,cron就会每天执行它
anacron程序
  • cron程序的唯一问题是它假定Linux系统是7×24小时运行的。除非将Linux当成服务器环境来运行,否则此假设未必成立
  • 如果某个作业在cron时间表中安排运行的时间已到,但这时候Linux系统处于关机状态,那么这个作业就不会被运行。当系统开机时,cron程序不会再去运行那些错过的作业。要解决这个问题,许多Linux发行版还包含了anacron程序
  • 如果anacron知道某个作业错过了执行时间,它会尽快运行该作业。这意味着如果Linux系统关机了几天,当它再次开机时,原定在关机期间运行的作业会自动运行。这个功能常用于进行常规日志维护的脚本。如果系统在脚本应该运行的时间刚好关机,日志文件就不会被整理,可能会变很大。通过anacron,至少可以保证系统每次启动时整理日志文件
  • anacron程序只会处理位于cron目录的程序,比如/etc/cron.monthly。它用时间戳来决定作业是否在正确的计划间隔内运行了。每个cron目录都有个时间戳文件,该文件位于/var/spool/anacron
  • anacron程序使用自己的时间表(通常位于/etc/anacrontab)来检查作业目录
    在这里插入图片描述
  • anacron时间表的基本格式和cron时间表略有不同:
period delay identifier command 
  • period条目定义了作业多久运行一次,以天为单位。anacron程序用此条目来检查作业的时间戳文件。delay条目会指定系统启动后anacron程序需要等待多少分钟再开始运行错过的脚本
  • command条目包含了run-parts程序和一个cron脚本目录名。run-parts程序负责运行目录中传给它的任何脚本,注意,anacron不会运行位于/etc/cron.hourly的脚本。这是因为anacron程序不会处理执行时间需求小于一天的脚本
  • identifier条目是一种特别的非空字符串,如cron-weekly。它用于唯一标识日志消息和错误邮件中的作业

使用新 shell 启动脚本

  • 如果每次运行脚本的时候都能够启动一个新的bash shell(即便只是某个用户启动了一个bash shell),将会非常的方便。有时候,希望为shell会话设置某些shell功能,或者只是为了确保已经设置了某个文件
  • 当用户登入bash shell时需要运行的启动文件,不是所有的发行版中都包含这些启动文件。基本上,依照下列顺序所找到的第一个文件会被运行,其余的文件会被忽略:
    • $HOME/.bash_profile
    • $HOME/.bash_login
    • $HOME/.profile
  • 应该将需要在登录时运行的脚本放在上面第一个文件中,每次启动一个新shell时,bash shell都会运行.bashrc文件。可以这样来验证:在主目录下的.bashrc文件中加入一条简单的echo语句,然后启动一个新shell,如下:
    在这里插入图片描述

在这里插入图片描述

  • .bashrc文件通常也是通过某个bash启动文件来运行的。因为.bashrc文件会运行两次:一次是当你登入bash shell时,另一次是当你启动一个bash shell时。如果需要一个脚本在两个时刻都得以运行,可以把这个脚本放进该文件中
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值