2012-08-10 97 views
1

我想知道是否可以手动唤醒已经入睡的perl脚本。 基本上,我将脚本设置为在执行某个操作后的一小时后休眠,10分钟后我意识到我希望它再次运行。如何手动唤醒perl睡眠功能?

我运行的平台是linux,带有一个tcsh shell。

再次,感谢所有帮助

+2

你怎么把它睡觉? – 2012-08-10 23:28:45

回答

5

在许多系统中,系统调用像sleep可以用信号中断。在这样的中断中,sleep将返回实际睡眠的秒数并设置$!。当然,你必须使用一个信号来让脚本继续。如果您还没有设置任何特定的信号处理程序,那么SIGSTOPSIGCONT的组合也可以实现。

例子:

$ perl -e 'print "slept for ", sleep 1000, " seconds.\n";' & 
[2] 6220 
$ kill -STOP 6220 
$ kill -CONT 6220 
slept for 8 seconds[2]+ Stopped  perl -e ... 

又如(琐细SIGUSR1处理程序):

$ perl -e '$SIG{USR1}=sub{}; print "slept for ", sleep 1000, "s.\n"' & 
[1] 2419 
$ kill -USR1 2419 
slept for 4s 
+1

什么perl,什么操作系统和什么shell?你能在没有其他工作的情况下复制背景吗? (我发现你的后台perl实际上是你的shell中的第2号作品)。我无法在v5.16,Linux 2.6和bash下重现 - 睡眠不受STOP和CONTINued影响,在合适的秒数后终止。古老的Linux [似乎错误地处理了SIGCONT](http://www.in-ulm.de/~mascheck/various/nanosleep_linux/SIGCONT),而perl的“可重新启动的系统调用”语义通常无论如何都会中断一个不重要的睡眠。 – pilcrow 2012-08-12 15:04:30

+0

该测试与Cygwin,任何版本和任何数量的后台作业已经运行。我无法让我的第一个例子在Linux中工作,所以我添加了第二个可行的例子。 – mob 2012-08-12 17:41:08

+0

谢谢!我能够在Linus终端上重现手动唤醒。 – user1539348 2012-08-13 16:27:17