信号 - pingdongyi/blog-2 GitHub Wiki

信号是系统向脚本或命令发出的消息,告知它们某个事件的发生。这些事件通常是内存错误,访问权限问题或某个用户试图停止你的进程。

信号

以下命令可以查看所有信号:

$kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL
5) SIGTRAP     6) SIGABRT  7) SIGEMT   8) SIGFPE
9) SIGKILL   10) SIGBUS  11) SIGSEGV 12) SIGSYS
13) SIGPIPE  14) SIGALRM 15) SIGTERM 16) SIGURG
17) SIGSTOP  18) SIGTSTP 19) SIGCONT 20) SIGCHLD
21) SIGTTIN  22) SIGTTOU 23) SIGIO   24) SIGXCPU
25) SIGXFSZ  26) SIGVTALRM   27) SIGPROF 28) SIGWINCH
29) SIGINFO  30) SIGUSR1 31) SIGUSR2

常用信息及含义:

信号 信号名 含义
1 SIGHUP 挂起或父进程被杀死
2 SIGINT 来自键盘的中断信号,通常是
3 SIGQUIT 从键盘退出
9 SIGKILL 无条件终止
11 SIGSEGV 段(内存)冲突
14 SIGALRM 闹钟
15 SIGTERM 软件终止(缺省杀进程信呈)

语法

kill [-s signal_name] pid ...
kill -l [exit_status]
kill -signal_name pid ...
kill -signal_number pid ...

其中-l是列出所有信号,其它三种是向某进程发送相应的信号

捕捉信息trap

通常我们会捕获一个信号来做一些处理,如清除临时文件、忽略该信息或询问用户是否终止该脚本的运行等。

其命令一般形式为:trap command signal(s),其中command需要用双引号括起来。

一般会有如下命令用法:

  • trap '' 2 3 忽略信号2和信号3,用户不能终止该脚本
  • trap 'commands' 2 3 如果捕捉到信号2或3,就执行相应的commands命令
  • trap 2 3 复位信号2和3,用户可以终止该脚本
trap 'my_exit' 2
loop=0
my_exit(){
    echo "you just hit <ctrl-c>,at nummber $loop"
    echo "I will exit now"
    exit 1
}

while :
do
    loop=`expr $loop + 1`
    echo $loop
done

eval命令

该命令会扫描并执行变量或字符串中的命令,如:

$test="pwd"
$eval $test
/Users/zhangbingbing
$eval "ls |grep hello"
hello

给每个值一个变量名

##aaa文件内容
name    bill
age     30
sex     male

###这里每次读入两个字符串
while read key value
do
    ###这里用echo输出由变量组成赋值表达式字符串,而``将其变为命令,由eval执行其变量,即变成真正的赋值
    eval `echo "${key}=${value}"`
done < aaa
echo "your name is $name,age is $age,sex is $sex"
⚠️ **GitHub.com Fallback** ⚠️