处理信号
信号 | 值 | 描述 |
---|---|---|
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提示符混杂输出,最好将STDOUT
和 STDERR
重定向
*
终端会话退出时,后台运行的也会退出
非控制台下运行脚本
nohup ./a.sh &
该命令阻断发送给该进程的SIGHUP
信号
*nohup
会解除终端与进程的关联,自动将STDOUT
,STDERR
消息重定向到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
来发邮件,因此使用时,最好对STDOUT
,STDERR
重定向
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
文件