Linux命令行与shell脚本编程大全笔记(控制脚本)

处理信号

信号 描述
1 SIGHUP 挂起进程
2 SIGINT 终止进程
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 尽可能终止进程
17 SIGSTOP 无条件停止进程,但不是终止进程
18 SIGTSTP 停止或暂停进程,但不终止进程
19 SIGCONT 继续运行停止的进程

*bash shell 会忽略信号3, 信号15,但是会处理信号1,2
CTRL + C 组合键生成SIGINT信号
CTRL + Z 组合键生成SIGTSTP信号
在这里插入图片描述
[1] 方括号中的为作业号

trap 可以在脚本中监看并拦截Linux信号,若果脚本收到trap后面的信号,则信号交由本地处理
trap "echo 'trap ctrl+c' " SIGINT 脚本中捕获SIGINT信号
trap "echo goodbye..." EXIT 捕获脚本退出(脚本任何时候退出都会触发)
trap "echo 'modi trap sigint' " SIGINT 修改捕获信号处理
trap - SIGINT 或者 trap -- SIGINT 删除捕获处理(单破折号或者双破折号)
*信号如果在捕获被移除前接收到,脚本依旧执行trap 中运行的指令,随后trap被移出,正常处理信号


以后台模式运行脚本
./a.sh & 后台运行只要加个 & 即可
* 脚本中的输出会和shell提示符混杂输出,最好将STDOUTSTDERR重定向
* 终端会话退出时,后台运行的也会退出


非控制台下运行脚本
nohup ./a.sh & 该命令阻断发送给该进程的SIGHUP信号
*nohup 会解除终端与进程的关联,自动将STDOUTSTDERR消息重定向到nohup.out文件
*如果运行了多个nohup 命令,所有的输出都将输出到nohup.out文件


作业控制
jobs 允许shell当前正在处理的作业
echo 'current PID : $$' 当前运行进程的PID $$ - 系统分配给脚本的PID
jobs -l 查看作业的PID

参数 描述
-l 列出进程的PID及作业号
-n 只列出上次shell发出的通知后改变了状态的作业
-p 只列出作业的PID
-r 只列出运行中的作业
-s 只列出已停止的作业

* + 带加号的作业为当前默认作业,命令行未指定任何作业号时,则该作业为操作对象
* - 减号为下一个默认作业
*任何时候都只有一个带加号和带减号的作业

bg 1 后台模式重启作业号为1 的作业
fg 1 前台模式重启作业号为1的作业


调整谦让度
-20 ~ 19 (-20)是最高优先级,(+19)最低优先级;调度优先级是内核分配给进程CPU的时间,记忆窍门:好人难做
nice 命令允许设置启动时的调度优先级
nice -n 10 ./a.sh & nice命令要和启动命令为同一行
ps -p 35973 -o pid,ppid,ni,cmd 查看进程谦让度
nice -n -10 ./a.sh nice命令会失败,普通用户只能降低优先级,作业运行成功

renice -n 12 -p 35973 调整指定进程的优先级
*只能对属于你的进程执行 renice
*只能通过renice 降低优先级
*root 用户可以随意调整优先级(升高或者降低)


定时运行作业
at 命令允许指定Linux系统何时运行脚本
at 的守护进程atd 会以后台模式运行,并每60秒检查/var/spool/at目录下的作业队列
at [-f filename] time 命令基本格式
*time时间如果错过,则在第二天那个时间运行指定作业
*time 支持标准的小时和分钟 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 作业会被提交到作业队列, a~z,A~Z,默认为a (最低), -q 参数可以指定不同的队列字母
at -f a.sh 10:15 now 使用at命令时,输出会利用sendmail来发邮件,因此使用时,最好对STDOUTSTDERR重定向
at -M -f b.sh tomorrow -M参数可以屏蔽作业产生的输出信息
atq 命令查看系统中有哪些作业在等待
atrm 1 删除等待的作业,作业好为1

cron程序会在后台运行并检查一个特殊的表crontab
min hour dayofmonth month dayofweek command 命令基本格式
crontab 允许使用特定值,取值范围,通配符(*)来指定条目
15 16 * * 1 sh /home/root/a.sh >> out.file 每周一4:15PM运行该命令(0-周日,6-周六)或者(mon, tue, wed, thu, fri, sat, sun
00 12 * * * if [ $(date +%d -d tomorrow) = 01 ] ; then ; sh a.sh 每个月最后一天执行命令,每天中午12:00检查当天是否是该月的最后一天

crontab -l 列出已有的cron时间表
crontab -e 为cron时间表添加条目

ls /etc/cron.*ly 该目录下有hourly, daily, monthly, weekly, 如果脚本要每天运行,将脚本复制到daily目录下即可

anacron 如果错过了执行时间,它会尽快运行该作业,常用于常规日志维护的脚本


使用新shell启动脚本
用户登录bash shell时,依照下列顺序找到的第一个文件会被运行,其他的则忽略

$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile

每次启动一个新shell时,bash shell 都会运行 .bashrc文件

你可能感兴趣的:(shell)