我想知道是否可以手动唤醒已经入睡的perl脚本。 基本上,我将脚本设置为在执行某个操作后的一小时后休眠,10分钟后我意识到我希望它再次运行。如何手动唤醒perl睡眠功能?
我运行的平台是linux,带有一个tcsh shell。
再次,感谢所有帮助
我想知道是否可以手动唤醒已经入睡的perl脚本。 基本上,我将脚本设置为在执行某个操作后的一小时后休眠,10分钟后我意识到我希望它再次运行。如何手动唤醒perl睡眠功能?
我运行的平台是linux,带有一个tcsh shell。
再次,感谢所有帮助
在许多系统中,系统调用像sleep
可以用信号中断。在这样的中断中,sleep
将返回实际睡眠的秒数并设置$!
。当然,你必须使用一个信号来让脚本继续。如果您还没有设置任何特定的信号处理程序,那么SIGSTOP
和SIGCONT
的组合也可以实现。
例子:
$ 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
什么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
该测试与Cygwin,任何版本和任何数量的后台作业已经运行。我无法让我的第一个例子在Linux中工作,所以我添加了第二个可行的例子。 – mob 2012-08-12 17:41:08
谢谢!我能够在Linus终端上重现手动唤醒。 – user1539348 2012-08-13 16:27:17
你怎么把它睡觉? – 2012-08-10 23:28:45