2012-08-10 98 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