Shell控制脚本
处理信号
-
常见Linux信号
-
1
-
SIGHUP
- 挂起终端
-
-
2
-
SIGINT
- 终止进程
-
-
3
-
SIGQUIT
- 停止进程
-
-
9
-
SIGKILL
- 无条件终止进程
-
-
15
-
SIGTERM
- 尽可能终止进程
-
-
17
-
SIGSTOP
- 无条件停止进程,但不是终止进程
-
-
18
-
SIGTSTP
- 停止或暂停进程,但不是终止进程
-
-
19
-
SIGCONT
- 继续运行停止的进程
-
-
生成信号
-
暂停
CRTL+Z
- SIGTSTP
-
终止
CRTL+C
- SIGINT
-
杀死进程
kill -9 pid
-
注意事项
- 暂停的进程保存在内存中,可恢复;终止的进程系统停止分配资源,不可恢复
捕获信号
-
shell脚本监听并拦截Linux信号,交由本地执行
-
基本语法
trap commands singles
-
捕获中断信号
trap echo "cound not interrupt the program" SIGINT
- shell脚本捕获到SIGINT信号后,即不会执行该信号,而是交由本地去执行显示信息的命令。这样可以阻止用户通过CRTL+C来终断进程(每次用户按下CRTL+C仅会显示消息,不会中断进程执行)
-
捕获退出脚本信号
trap "echo Goodbye" EXIT
- shell脚本捕获到EXIT信号后,马上显示echo信息,然后退出脚本
- EXIT信号可以来自完成任务后的正常退出,也可以是用户按下CRTL+C产生的提前退出(先捕获EXIT信号,后捕获SIGINT信号)
-
修改捕获
trap "first trap" SIGINT
trap "second trap" SIGINT
- 修改捕获后,捕获SIGINT后显示的信息会发生改变。但如果SIGINT信号是在信息修改前被捕获,就会按照原来的trap命令进行处理
-
移除捕获
trap -- SIGINT
- 移除捕获后,用户按下CRTL+C后,会中断进程
- 如果SIGINT信号是在移除捕获之前被捕获,则按照之前的trap命令进行处理
后台模式运行脚本
-
后台模式
-
控制台下运行脚本
-
定义
- 进程并非运行在当前终端上,所以进程所产生的标准输入和标准输出以及标准错误都不会在当前终端上显示,这样可以把终端让出来处理其他东西,提高系统的可用性和运行效率
-
基本语法
command & or ./xxx.sh &
-
注意事项
- 每个后台模式任务都有shell分配的后台进程作业号和系统分配给进程的PID
- 后台运行进程时,进程的标准输出和标准错误仍然会在屏幕显示,但是屏幕输出的同时,你可以运行命令
- 终端退出,后台进程随之退出
-
-
非控制台下运行脚本
-
定义
- 通过使用nohup命令运行脚本,会使得进程和终端解关联,进程的标准输出将不会在屏幕显示;而且脚本会自动忽略来自终端的SIGHUP命令
-
基本语法
nohup command or ./xxx.sh &
-
注意事项
- nopub所保护的进程的输出会输出到一个nohup.out文件中,如果在同一目录运行多条nopub命令,他们的输出会追加到同一个文件
-
-
作业控制
-
查看作业
-
jobs命令
-
jobs命令列出shell的作业和状态
jobs -l
-
注意事项
- jobs命令输出的作业中,带+号的为默认作业,带—的为下一默认作业
- 后台有多个正在运行的作业,但任何时候只有一个带加号的作业和一个带减号的作业
-
-
-
重启停止的作业
-
前台重启
fg 作业号
-
后台重启
bg 作业号
-
注意事项
- 前台重启时,前台会接管当前工作的终端,直到该作业完成后,命令行提示符才会出现
-
调整调度优先级
-
定义
- 调度优先级是系统内核分配给进程的CPU时间,优先级越高,分配的资源越多。shell启动的进程默认的调度优先级都是0
-
未运行命令
-
设置调度优先级
- nice命令
nice -n clsss command or ./xxx.sh > xxx.out &
-
查看调度优先级
ps -p pid -o pid,ppid,ni,cmd
-
-
已运行命令
-
设置调度优先级
- renice命令
renice -n class command or ./xxx.sh >xxx.out &
-
查看调度优先级
ps -p pid -o pid,ppid,ni,cmd
-
-
注意事项
- 优先级从-20到19,数值越小,优先级越高
- 普通用户只可以降低调度优先级,不可以提高调度优先级
- 普通用户只能对属于自己的进程进行nice或renice命令
- root用户可以任意使用nice或renice调整调度优先级
定时运行作业
-
at命令
-
at提交定时任务到作业队列,由守护进程atd到指定目录进行检查和执行(指定时间内只执行一次)
-
命令
-
提交任务
-
命令交互式
at time
- 指定提交任务时间后会进入at交互模式,输入相关命令后,按下ctrl+d后退出交互
-
文件脚本式
at -f filename time
- 指定提交任务时间和命令文间
-
可选参数
-
-m
- 无论有无结果输出,都要发邮件给用户
-
-q
- 指定队列(从a-z),字母越靠前,任务执行的优先级越高
-
-M
- 屏蔽结果输出
-
-
注意事项
- 任务执行结果默认不会在屏幕显示,而是直接发邮件给用户,可以使用mail命令查看结果(按q退出),或者直接到/var/spool/mail/$USER目录进行查看
- 如果不想使用邮件查看结果,可以进行重定向(> /dev/null 2>&1),或使用-M选项来屏蔽结果输出
-
-
列出等待
atq
- 显示作业号,时间日期,所在队列
-
删除任务
atrm 作业号
-
-
注意事项
- 如果在指定时间没有执行成功,会在第二天相同时间运行指定作业
- at命令的时间格式灵活,可使用时间增量
- 作业删除,只能删除自己,不能删除他人
-
-
cron命令
-
定期定时执行任务,相当于时程表
-
cron时间表
min hour dayofmonth month dayofweek command
-
时间值
-
*
- 代表每
-
a-b
- 代表范围
-
/
- 代表时间间隔
-
a,b,c
- 代表具体时间点
-
-
实例
-
每分钟执行一次
* * * * * command
-
每天每个n个小时执行一次
-
* */n * * * command
-
每个月的每个星期五下午17点00分执行一次
-
00 17 * * 5 command
-
每个月每一日的0:20,1:20,5:20执行一次
20 0,1,5 * * * command
-
每个月的第一天的12点执行一次
00 12 1 * * command
-
-
注意事项
-
由于一年的每个月份日期期限不一致,导致指定每个月最后一天的时候,dayofmonth会无法执行(不知道是否为最后一天),因此要结合if+date判断今天是否为最后一天,如果是,才执行命令
00 12 * * * if [ $(date +%d -d tomorrow) =01] ;then;command
-
-
-
操作时间表
-
crontab
-
编辑时间表
crontab [-u user ] -e
-
删除时间表
crontab [-u user ] -r
-
列出时间表
crontab [-u user ] -l
-
-
-
使用cron预配置目录
-
使用cron的时间模板,只需要把需要执行的脚本文件赋值到cron预配置的目录下,cron进程会根据目录的执行周期进行脚本执行(适用于对执行时间精度要求不高的场景)
-
每天执行一次
cp xxx.sh /etc/cron.daily
-
每小时执行一次
cp xxx.sh /etc/cron.hourly
-
每周执行一次
cp xxx.sh /etc/cron.weekly
-
每月执行一次
cp xxx.sh /etc/cron.monthly
-
-
-
-
anacron程序
-
如果由于系统错误或关机,导致在某段时间内cron目录内该执行的脚本未执行,anacron会为cron目录处理错过了执行时间的作业
-
anacron使用自己的时间表来检查cron目录的时间戳文件,判断是否文件是否按预期执行(时间戳文件位于/var/spool/anacron里面)
-
anacron时间表
- period delay identifier command
- period指作业多少天执行一次
- delay指等待多少分钟后开始恢复运行错过的脚本
- identifier标识日志消息和错误邮件里面的作业
- command包含一个run-parts程序(负责运行目录传给他的脚本的)和一个cron脚本目录名
-
-
-
脚本自启动
-
登录shell自动运行
- 用户每次登录进系统打开的第一个shell称为登录shell,登录shell会加载当前用户的三个启动文件(.bash_profile .bash_login .profile)其中的一个(一般按照顺序来),用户可以脚本放到第一个文件里面,实现登录shell自加载
-
登录shell和打开shell自动运行
- .bashrc文件会在登录shell和打开新shell时允许,用户可以把脚本放进这个文件里面,实现登录shell和打开新shell自动允许
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫