shell脚本控制

信号

  • 1——SIGHUP(挂起进程)
  • 2——SIGINT(终止进程;Ctrl+C)
  • 9——SIGKILL(无条件终止进程)
  • 18——SIGSTP(停止或暂停进程,但不终止进程;Ctrl+Z)
  • 19——SIGCONT(继续运行停止的进程)

kill -9 PID:无条件终止PID标示的进程

trap "echo ' Sorry! I have trapped Ctrl+C'" SIGINT:捕获信号,并用对应命令对信号进行响应

trap "echo ' I modified the trap!'" SIGINT:修改响应信号命令

trap -- SIGINT:取消对信号的响应,使用 -- 或 - 均可

trap "echo Goodbye..." EXIT:捕获进程退出信号

脚本控制

./test.sh &:使用后台运行脚本,由于其与当前终端共享STDOUT和STDERR,因此最好将脚本输出重定向。此时如果终端退出,所有其创建的进程也将退出。

nohup ./test.sh &:保证创建的进程执行完毕,不受其创建终端的影响。此时,脚本进程的输出也不回在终端显示,其将自动创建nohup.out文件进行存储。不过此时多个进程将共享一个nohup.out文件。

jobs:获取后台的作业(-l:给出PID和作业号;$$:当前进程的PID;作业号后的加号(+)表示当前的默认作业,减号(-)表示下一个默认作业)

bg taskID:以后台模式重启对应作业,如果未提供taskID,则重启默认作业

fg taskID:以前台模式重启对应作业,与bg类似

nice -n 10 ./test,sh > test.out &:为对应进程指定优先级(-20 ——19 越大越nice;bash默认以0启动所有进程)

renice -n 10 -p PID:改变指定运行中进程的优先级

定时作业

at -M -f test.sh now:单次在指定时间运行对应脚本(-M:由于at默认将输出通过邮件发送,如果不想接受邮件或重定向可以使用-M进行屏蔽。如果没有安装sendmail,也无法获得任何输出)系统提供了26个不同等级(a-z;A-Z)的作业队列,字母排序越高越nice,默认提交a队列。

    时间格式:10:15; 10:15 PM; now; noon; midnight; teatime (4 PM); MMDDYY; MM/DD/YY; DD.MM.YY; Jul 4; Dec 25; 

atq:显示等待执行的作业

atrm:删除等待执行的作业

cron时间表指定需要定期执行的作业(格式:min hour dayofmonth month dayofweek command)。注意command中最好使用文件完整路径。如果需要运行时,刚好系统关闭这些计划并不会在开机时再被执行。

    每天10:15(15 10  * * * command)

    每周一4:15(15 16 * * 1 command)

    每个星期天中午12点(00 12 * * 0 command)(0为周日;6为周六)

    每月最后一天中午12点(00 12 * * * if [ `date +%d -d tommorrow` = 01 ] then ; command)

crontab:处理时间表(-l:列出已有cron时间表;-e:添加条目)

cron目录:/etc/cron.daily(每天不定时执行目录下的对应脚本)。同理,/etc/cron.hourly; /etc/cron.monthly; /etc/cron.weekly

anacron:保证未执行计划在重新开机被尽快执行。

    时间表:period delay identifier command