控制脚本
#处理信号
Linux信号
信 号 值 描 述
1 SIGHUP 挂起进程
2 SIGINT 终止进程
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 尽可能终止进程
17 SIGSTOP 无条件停止进程,但不是终止进程
18 SIGTSTP 停止或暂停进程,但不终止进程
19 SIGCONT 继续运行停止的进程
生成信号
中断进程(组合键:Ctrl+C,生成信号2)
暂停进程(组合键:Ctrl+Z,生成信号18)
$ sleep 100
^Z
[1]+ Stopped sleep 100
$
$ ps -l -- 查看终止的进程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 501 2431 2430 0 80 0 - 27118 wait pts/0 00:00:00 bash
0 T 501 2456 2431 0 80 0 - 25227 signal pts/0 00:00:00 sleep -- S的状态为T表示暂停的进程
0 R 501 2458 2431 0 80 0 - 27034 - pts/0 00:00:00 ps
$
$ kill -9 2456 -- 通过已知PID发送信号9,无条件终止进程
捕获信号(trap)
如何使用 trap 命令来忽略 SIGINT 信号
#
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
#
echo This is a test script
#
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
echo "This is the end of the test script"
#
如何捕获exit退出
#
trap "echo Goodbye..." EXIT -- 当使用Ctrl+C也会获得退出
#
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
修改或移除捕获(移除--,恢复-)
#
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
# Remove the trap
trap -- SIGINT -- 移除捕获之前的脚本是无法被中断的,之后的可以
echo "I just removed the trap"
#
count=1
while [ $count -le 5 ]
do
echo "Second Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
#后台模式
sleep 10 -- 会话暂停10秒
sleep 10& -- 后台等待
jobs -l -- 查看进程状态
(sleep 2 ; echo $BASH_SUBSHELL ; sleep 2)& -- 将进程列入后台
coproc(略)-- 协程(前台后台同事运行)
#以后台模式运行脚本
后台运行脚本,只要在命令后加个 & 符就行了
sh sw_cs.sh & -- [1] 3231 , 作业号与PID,进程的PID是唯一的。当后台进程运行时,它仍然会使用终端显示器来显示 STDOUT 和 STDERR 消息
运行多个后台作业(后台运行过程可以在控制台输入其他命令,互不影响)
在非控制台下运行脚本(nohup,无法执行sh文件。略)
#作业控制(jobs)
脚本用 $$ 变量来显示Linux系统分配给该脚本的PID
查看作业
jobs -l -- 带加号的作业会被当做默认作业 如:
[1] 1950 Running ./test10.sh > test10a.out &
[2]- 1952 Running ./test10.sh > test10b.out &
[3]+ 1955 Running ./test10.sh > test10c.out & -- 最后一个执行的作为默认作业
重启停止的作业
$ bg -- 加号的后台默认作业将重启。注意不会被列出作业号,完了进程会结束。
[1]+ ./test11.sh &
$ bg 2 -- 作业号为2的后台进程重启
$ fg 2 -- 要以前台模式重启作业,可用带有作业号的 fg 命令
#调整优先级(-20最高,19最低。进程默人从优先级0开始)
nice命令只能让脚步以更低的优先级运行,只能命令启动时的调度优先级。在运行中不能使用
$ nice -n 10 ./test4.sh > test4.out & -- -n并不是必须的,可以直接使用 nice -10
[1] 4973
$ ps -p 4973 -o pid,ppid,ni,cmd -- 验证优先级
PID PPID NI CMD
4973 4721 10 /bin/bash ./test4.sh
$
renice改变系统上已运行命令的优先级,使用和性质和nice差不多。只有root用户才能任意调度优先级,而不是只能降低。
#定时运行作业
at(略)
crontab
格式:min hour dayofmonth month dayofweek command (dayofweek,0代表周日,6代表周六)
如:00 12 * * * if [ ` date +%d -d tomorrow ` = 01 ] ; then ; command -- 每天中午12点判断是否是月最后一天,如果是执行
crontab -l -- 查询调度任务
anacron时间表(略。处理系统关机错过的调度)
生活就要逢山开路遇水搭桥,愿共勉!