Perl 程序在运行时, 会启动一个进程, 可以接收其它进程发送的信号. 通常需要监听的信号是终止程序信号, 在接收到终止信号时, 可以对程序做一些资源清理工作.
1. 接收其它进程发送的信号
perl 内置了%SIG 存储了perl 可接收的所有信号参数, 存储格式为: key=method我们只需要给对应的key对应的value设置相应的方法即可,这样当程序接收到信号,就会执行对应的方法.注意: 当perl 主程序接收到相应的信号之后,会暂时中断目前正在执行的流程, 而去执行信号对应的方法, 当方法完成之后,再回到原来执行的位置,继续执行.信号方法的注册必须在脚本程序最前面,因为随时都可能执行.
$SIG{'INT'} = 'clean';
sub clean{
print 'excute clean operation...';
exit
;
}
2. 测试用例
测试脚本运行的时候, 需要启动两个shell 窗口, 一个窗口执行脚本, 另一个窗口监控进程脚本名称为proce.pl, 如果修改脚本名称的话, 查看进程的命令需要修改 = 脚本运行中, 需要配合使用Ctrl+C 来向进程中发送终止信号.
2.1 测试脚本
$SIG{'INT'} = 'clean';
sub clean {
print "程序异常结束, 执行清理操作...\n";
}
print "\n#################### 1.1 system 调用其它程序 ####################\n";
$JAVA_HOME = "java home";
print "perl JAVA_HOME:"; system
"echo $JAVA_HOME";
print "shell JAVA_HOME:"; system
"echo \$JAVA_HOME";
print "shell JAVA_HOME:"; system
'echo $JAVA_HOME';
print "\n#################### system 返回结果 ####################\n";
$code = system
"date";
print "正确执行返回值: $code \n";
$code = system
"hello";
print "错误执行返回值: $code\n";
print "\n############# 1.2 qx()/`` 捕获系统输出 ##################\n";
$JAVA_HOME = qx' echo $JAVA_HOME ';
print "shell:JAVA_HOME=$JAVA_HOME ";
$JAVA_HOME = qx ( echo \$JAVA_HOME );
print "shell:JAVA_HOME=$JAVA_HOME ";
$JAVA_HOME = `echo \$JAVA_HOME`;
print "shell:JAVA_HOME:$JAVA_HOME ";
print "\n#################### 1.3 修改子程序的环境变量 ################\n";
$ENV{JAVA_HOME
}="JAVA_HOME";
print "子程序:JAVA_HOME:"; system
'echo $JAVA_HOME';
print "程序即将休眠30秒,请在另外窗口中执行命令查看进程, 查看后使用Ctrl+C 发送中断信号\n";
print "查看命令:ps -ef | grep -v grep | grep -E \"process.pl|sleep\"\n";
system
"sleep 30000";
print "\n#################### 接收Ctrl + C 信号 ################\n";
print "\n#################### exec ################\n";
print "程序即将终止主进程, 并进入exec 进程,请在另外窗口中执行命令查看剩余进程, 查看后使用Ctrl+C 发送中断信号\n";
print "查看命令:ps -ef | grep -v grep | grep -E \"process.pl|sleep\"\n";
exec
"sleep 100000 \n";
2.2 脚本输出
[admin@localhost perl
]$ ./process.pl
perl JAVA_HOME:java home
shell JAVA_HOME:/opt/app/jdk/jdk1.6.0_31
shell JAVA_HOME:/opt/app/jdk/jdk1.6.0_31
Thu Jul 6 13:21:54 CST 2017
正确执行返回值: 0
错误执行返回值: -1
shell:JAVA_HOME
=/opt/app/jdk/jdk1.6.0_31
shell:JAVA_HOME
=/opt/app/jdk/jdk1.6.0_31
shell:JAVA_HOME:/opt/app/jdk/jdk1.6.0_31
子程序:JAVA_HOME:JAVA_HOME
程序即将休眠30秒,请在另外窗口中执行命令查看进程, 查看后使用Ctrl+C 发送中断信号
查看命令:ps -ef
| grep -v
grep | grep -E
"process.pl|sleep"
^C
程序即将终止主进程, 并进入exec 进程,请在另外窗口中执行命令查看剩余进程, 查看后使用Ctrl+C 发送中断信号
查看命令:ps -ef
| grep -v
grep | grep -E
"process.pl|sleep"
^C
2.3 第一次暂停时查看系统进程
有两个进程, 一个是主进程, 一个是system 启动的休眠子进程
$
ps -ef
| grep -v
grep | grep -E
"process.pl|sleep"
admin 4201 32469 0 13:20 pts/1 00:00:00 /usr/bin/perl ./process.pl
admin 4218 4201 0 13:20 pts/1 00:00:00
sleep 30000
2.4 第二次暂停时, 查看系统进程
只有一个进程, 主进程结束, 只剩下由exec 启动的休眠子进程.
$
ps -ef
| grep -v
grep | grep -E
"process.pl|sleep"
admin 4201 32469 0 13:20 pts/1 00:00:00
sleep 100000