我在这里不知所措。我正在尝试创建一个脚本来自动执行某些操作。我有一个函数 exitfn()它应该捕获 ctrl + c 并执行。我这样做是因为,如果你看,在该功能下面,这个操作有时会挂起,我只需要运行它。它没有完成,所以我告诉用户按ctrl + c然后它应该运行该功能,但我会回来:
/ bin / grep:/ var / lib / mrtg / cfgs / .cfg:没有这样的文件或目录。
我的想法:
我使用整个陷阱错了吗?
#!/bin/bash
echo "Enter the name of the device: > "
read dName
echo "Now enter device type [cpu, ram, : > "
read dType
echo "Enter the devices actual value with % symbol: > "
read aValue
echo "Enter the desired threshold with % symbol: > "
read dValue
echo "Grounding..."
n=`locate thresholdHandler.pl`
cd ${n%thresholdHandler.pl}
echo "Hit Ctrl+C to continue......"
exitfn() {
trap SIGINT
echo;
echo "Running second command, wait 3 seconds"
sleep 3
./thresholdHandler.pl output above $dname.$dType $dValue $aValue
echo "Complete"
exit
}
trap "exitfn" INT
./thresholdHandler.pl output above $dName.$dType $aValue $dValue
sleep 10
trap SIGINT
感谢您的时间。
答案 0 :(得分:2)
您在脚本中使用trap
方式太多了:)
您的代码应如下所示:
echo "Hit Ctrl+C to continue......"
exitfn() {
trap "" SIGINT #we trap any further ctrl + c and force execution of exitfn
echo;
echo "Running second command, wait 3 seconds"
sleep 3
./thresholdHandler.pl output above $dName.$dType $dValue $aValue
echo "Complete"
exit 0
}
trap "exitfn" SIGINT #here, only ctrl+c is trapped. Add more signals here if needed
./thresholdHandler.pl output above $dName.$dType $aValue $dValue
sleep 10
一般来说,陷阱的正确用法是trap "instructions" SIGNAL[S]
。将该行放入脚本后,陷阱将在下面的所有指令中激活(之前的指令不会触发陷阱)。
如果要在退出函数中强制等待perl脚本的执行,只需捕获SIGINT并执行任何操作。
关于你的第一点,是的,thresholdHandler.pl
将会运行。但是,如果你点击 CTRL + C ,它会运行2次(一次是通过常规脚本,虽然不完整,因为它是由SIGINT中断的,一次是通过exitfn当它被陷阱调用时,具有不同的值(我不知道这是否是预期的或复制exmaple时的简单错误)。