- 论坛徽章:
- 0
|
回复 7# sjdy521
我有写写过一个程序是:在等待用于输入的过程中,输入y继续,输入n退出,但是很多用户就不看提示,强制用ctrl+c或者ctrl+z或者有的更干脆用关掉ssh这种方式来退出,在这种情况下我捕获了$SIG{"SIGTSTP "}和 $SIG{"INT"}这两个信号是成功了。
但是在另外一种情况是:主进程运行过程中,我用system调用了另外一个perl命令,在这个perl命令还在运行过程中用户使用ctrl+z想停止这个perl命令的运行并且退出整个程序。这种情况下在主进程里捕获$SIG{"SIGTSTP "}信号没有捕获成功。
举例说明:
下面这种情况是成功了:如果有ctrl+c或者ctrl+z行为就会调用errorsub函数。
###处理循环输入
sub cycinput
{
print RED,"\n\n\n*********************************************************************************\n",RESET;
print RED,"**如果要继续修改配置文件请输入Y或者y,如果不需要修改其他配置请输入n或N直接将改好的配置同步到服务器。\n",RESET;
print RED,"**如果没有输入n或N的话就重启服务则配置不会在服务器端生效,请注意!\n",RESET;
print RED,"**如果需要退出请输入q或Q,这个时候修改的配置会在部署平台生效,但是并没有同步到服务器\n",RESET;
print RED,"**如果要重启系统,请运行命令tremotecmd重启,谢谢。\n",RESET;
$SIG{TERM}=$SIG{INT}=$SIG{TSTP}=\&errorsub;
chomp($iscontinue=<STDIN>);
下面这种情况是不成功的:如果有ctrl+c或者ctrl+z行为就会直接退出
$iserr=system("export DEPLOY_PASSWORD=xxxx;/wls/bankdplysys/tools/deploytool dremotecmd -s $system -a $action |tee /home/banktest/logs/toperate.log/$system/$tremotecmdlog");
$SIG{TERM}=$SIG{INT}=$SIG{TSTP}=$SIG{HUP}=\&errorsub; |
|