25. Perl 进程管理-进程间信号交互

    xiaoxiao2022-07-04  193

    Perl 程序在运行时, 会启动一个进程, 可以接收其它进程发送的信号. 通常需要监听的信号是终止程序信号, 在接收到终止信号时, 可以对程序做一些资源清理工作.

    1. 接收其它进程发送的信号

    perl 内置了%SIG 存储了perl 可接收的所有信号参数, 存储格式为: key=method我们只需要给对应的key对应的value设置相应的方法即可,这样当程序接收到信号,就会执行对应的方法.注意: 当perl 主程序接收到相应的信号之后,会暂时中断目前正在执行的流程, 而去执行信号对应的方法, 当方法完成之后,再回到原来执行的位置,继续执行.信号方法的注册必须在脚本程序最前面,因为随时都可能执行. #必须在程序最开始设置, 设置接收到ctrl + C 信号时执行的方法 $SIG{'INT'} = 'clean'; #接收到ctrl+C 信号时处理方法 sub clean{ print 'excute clean operation...'; exit; #接收到信号时,需要手工调用exit 函数,否则程序不会退出 }

    2. 测试用例

    测试脚本运行的时候, 需要启动两个shell 窗口, 一个窗口执行脚本, 另一个窗口监控进程脚本名称为proce.pl, 如果修改脚本名称的话, 查看进程的命令需要修改 = 脚本运行中, 需要配合使用Ctrl+C 来向进程中发送终止信号.

    2.1 测试脚本

    #!/usr/bin/perl #指定程序接收到Ctrl+C 信号时最后执行的方法clean,必须放在程序最前面 #INT 信号代表从键盘输入Ctrl+C结束程序 $SIG{'INT'} = 'clean'; #定义clean方法 sub clean { print "程序异常结束, 执行清理操作...\n"; #显示调用退出函数, 否则会从接收到Ctrl+C信号的地方继续执行行 #exit; } 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哈希中的值, 直接影响子程序的系统环境变量 $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 #################### 1.1 system 调用其它程序 #################### 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 #################### system 返回结果 #################### Thu Jul 6 13:21:54 CST 2017 正确执行返回值: 0 错误执行返回值: -1 ############# 1.2 qx()/`` 捕获系统输出 ################## 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 #################### 1.3 修改子程序的环境变量 ################ 子程序:JAVA_HOME:JAVA_HOME 程序即将休眠30秒,请在另外窗口中执行命令查看进程, 查看后使用Ctrl+C 发送中断信号 查看命令:ps -ef | grep -v grep | grep -E "process.pl|sleep" ^C #################### 接收Ctrl + C 信号 ################ #################### exec ################ 程序即将终止主进程, 并进入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
    最新回复(0)