我的新浪微博:http://weibo.com/u/1602714773 CSDN博客:http://blog.csdn.net/hunterno4

Linux Shell笔记之脚本控制

上一篇 / 下一篇  2013-11-15 21:09:56 / 个人分类:Linux

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

bash shell默认会忽略任何3和15的信号,但会处理收到的1和2信号

2.产生信号
1)终止进程
Ctrl+C会产生信号2终止进程
2)暂停进程
Ctrl+Z会产生信号18停止进程
# sleep 100
[1]+  Stopped                 sleep 100

# ps au
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root     25186  0.0  0.0   3680   468 pts/1    T    04:16   0:00 sleep 100
root     25240  0.0  0.0   4216   940 pts/1    R+   04:19   0:00 ps au
root     26781  0.0  0.1   4620  1424 pts/2    Ss+  Nov09   0:00 bash
shell中运行的每个进程称为作业,已停止的作业状态为T

3.捕捉信号
1)捕捉信号
#!/bin/bash
trap "echo 'I have trapped Ctrl+C'" SIGINT SIGTERM         trap后为""空则不显示信息,脚本不会被Ctrl+C终止
count=1
while [ $count -le 10 ]
do
   echo "loop #$count"
   sleep 2
   count=$[ $count + 1 ]
done

# ./trap 
loop #1
loop #2
loop #3
loop #4
I have trapped Ctrl+C
loop #5

2)捕捉脚本退出时的信号
#!/bin/bash
trap "echo 'goodbye'" EXIT                                捕捉EXIT信号

3)移除捕捉
#!/bin/bash
trap "echo 'goodbye'" EXIT
count=1
while [ $count -le 2 ]
do
   echo "loop #$count"
   sleep 2
   count=$[ $count + 1 ]
done
trap - EXIT                                                trap后加-号移除信号捕捉

4.后台运行脚本
# ./trap &   
                 加&符号后台运行,进程会话退出,后台进程也会退出
[5] 30618                    方括号内为作业号,之后为PID

# nohup ./trap &            加nohup命令,即使退出终端,脚本也不会终止
[5] 30725
# nohup: appending output to `nohup.out'    脚本结束后生成nohup.out文件,包含标准输出信息

5.作业控制
1)查看作业
# jobs                       -l选项显示PID及作业号
[1]   Stopped                  sleep 100  (wd: ~)
[2]   Stopped                   ./trap
[3]-  Stopped                  ./trap vi trap                 带-号为下一个默认作业
[4]+  Stopped                 ./trap                         带+号会被当作默认作业

2)重启停止的作业
# bg 2                        后台模式重启一个作业,作业号为2
# fg 2                        前台模式重启一个作业

6.调整谦让度
默认情况下,Shell启动的所有进程拥有相同的高度优先级
优先级从-20(最高优先级)到20(最低优先级)
1)nice
# nice -n 10 ./trap > out.txt &        nice命令在启动时调整优先级,普通用户只能降低优先级

2) renice
# ps al
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0 22854 22850  15   0   4620  1452 wait   Ss   pts/1      0:00 -bash
0     0 26781 26770  16   0   4620  1424 -      Ss+  pts/2      0:00 bash
0     0 30927 22854  15   0   4440  1040 finish T    pts/1      0:00 /bin/bash ./trap
# renice 10 -p 26781
renice只能对属于自己的进程执行renice,只能降低进程的优先级,root用户可以调整任何优先级

7.定时任务
1)cron时间表
min hour dayofmonth month dayofweek command

2)查看cron表
$ crontab -l
$ crontab -e                    清加条目

3)cron目录
/etc目录下cron目录,脚本放于这些目录下就可定时执行
cron.hourly
cron.daily
cron.weekly
cron.monthly
cron表中的作业当系统关机后,期间的作业再启动系统后不会运行

4)anacron程序
系统关机了,当再次启动后,anacron程序会尽快运行错过的计划好的作业
anacron程序只处理cron目录中的程序,但不会处理/etc/cron.hourly的脚本
anacron格式:period delay identifier command
period定义多久运行一次,单位天
delay定义系统启动后多少分钟后开始运行错过的脚本
$ cat anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

1       65      cron.daily                  run-parts /etc/cron.daily
7       70      cron.weekly              run-parts /etc/cron.weekly
30      75      cron.monthly            run-parts /etc/cron.monthly

8.开机自启动
开机读取/etc/inittab文件
开机脚本一般放于/etc/rc#.d目录,其中#为运行级别
或者/etc/init.d目录

本地开机文件
Ubuntu         /etc/rc.local
debian         /etc/init.d/rc.local
Fedora         /etc/rc.d/rc.local

为系统中的每个用户运行一个脚本:/etc/bashrc

inittab程序:格式 label:runlevel:action:process
1)label
id              定义缺省init程序运行级别
ca              按下“Ctrl+Alt+Delete”时运行的进程
si              指定系统初始化进程
pf              UPS监控软件通知电源被切断时运行的进程
pr              真正关闭系统前,UPS发出电源恢复信号时运行的进程

2)runlevel     运行级别,可不指定
3)action
wait            init程序运行此程序一次,并等待运行结束才进入下一步
ctrlaltdel      按下“Ctrl+Alt+Delete”时运行Process字段指定的值
respawn         保证一直处于运行状态的进程,若进程终止,则重启进程

4)process      运行的命令

#
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
#
# Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)

id:5:initdefault:

# System initialization.   运行rc.sysinit进行系统初始化
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE     按下“Ctrl+Alt+Delete”时关机
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.   取消关机
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels          始终打开6个终端控制台
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon

TAG: 信号 Linux linux 定时任务 作业 开机自启动

 

评分:0

我来说两句

Open Toolbar