有人能告訴我如何在Perl中解僱和忘記一個流程嗎?我已經看過ruby: how to fire and forget a subprocess?在Ruby中做同樣的事情。我該如何在Perl中啓動並忘記進程?
回答
從perlfaq8的答案How do I start a process in the background?
幾個模塊可以啓動不會阻止你的Perl 程序等工序。您可以使用IPC :: Open3,Parallel :: Jobs,IPC :: Run和POE模塊中的一些 。有關更多詳情,請參閱CPAN。
你也可以使用
system("cmd &")
或在perlfunc記錄在「叉」,在perlipc進一步 例子,你可以使用叉子。有些事情需要注意,如果你使用的是Unix的 像系統:
STDIN,STDOUT和STDERR是共享的
兩個主要過程和背景執行一個(「子」 進程)共享相同的STDIN,STDOUT和STDERR文件句柄。如果 都試圖一次訪問它們,可能會發生奇怪的事情。您可能想要爲孩子關閉或重新打開這些內容。你可以通過打開一個管道(見perlfunc中的「open」)在 附近得到 ,但在 的某些系統上,這意味着子進程不能超過父進程 。
信號
你必須趕上SIGCHLD信號,可能還有SIGPIPE了。 當後退過程結束時發送SIGCHLD。當您寫入子進程已關閉的文件句柄 (未處理的SIGPIPE可能會導致程序靜默死亡)時,發送SIGPIPE爲 。 這不是「系統(」cmd &「)」的問題。
殭屍
你必須做好準備,「收穫」,當它完成 子進程。
$SIG{CHLD} = sub { wait };
$SIG{CHLD} = 'IGNORE';
您還可以使用雙叉。您立即等待()您的 第一個孩子,並且init守護進程將等待()爲您的孫子 一旦退出。
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "exec failed!";
}
exit 0;
}
waitpid($pid, 0);
請參閱perlipc中的「信號」以獲取其他代碼示例。 「系統(」編&「)」並不是「殭屍」的問題。
如果你想守護進程的Perl腳本我已經尋找到Proc::Daemon.
實際上,我不想守護它,我只需要在執行我的主腳本的時候在後臺啓動一個監視腳本。而且我只能使用基本的Perl 5.6.0,因爲這是在內存嚴重有限的嵌入式系統上執行的,我幾乎沒有任何模塊可以使用。 – 2010-01-25 16:57:31
那麼你不應該使用system()
我瞭解這個呼叫等待功能的繼續執行之前的回報。我只是簡單地向linux發送消息,並以這種方式啓動進程,但請記住,這種方式將啓用shell的新副本,因此如果您正在尋找性能,我不會在循環中執行此操作,例如:
process_name > /dev/null 2>&1 &
;
這將啓動過程重定向STDOUT
和STDERR
到/dev/null。
如果您希望在「父」進程退出時看門狗「子」進程消失,那麼您並不希望父進程「觸發並忘記」該子進程。您可能需要fork(如brian d foy所述)或將父項的PID傳遞給子項(所以後者可以輪詢流程表 - 不推薦)。
實際上,運行一個看門狗腳本作爲一個子進程可能是一個壞主意,因爲如果主腳本意外死掉(但是如果父母死了,那麼所有的孩子都這麼做),大概是看守應該做些什麼。 另一種方法是讓「主進程」設置一個命名管道,並在退出時寫入「心跳」消息+「完成」消息,而看門狗(以真正的「fire and forget」模式啓動系統(「cmd&」))從命名管道讀取,並在「完成」消息到達或「心跳」消息停止時發出通知。 – Peter 2010-01-25 22:34:43
- 1. Java - 如何啓動和忘記進程
- 2. 如何用Perl啓動多個fire並忘記PHP腳本?
- 3. 如何觸發並忘記子進程?
- 4. 在Perl中啓動的退出進程
- 5. 如何在Perl中啓動外部進程?
- 6. 如何用命令行參數在perl中啓動進程?
- 7. 如何在Perl中啓動後臺進程?
- 8. 在Perl中,我該如何等待線程並行結束?
- 9. 如何:在Kotlin中觸發並忘記異步協程
- 10. 忘記密碼並記住我?
- 11. 使用ReactiveUI進行掃描並忘記
- 12. 我該如何將兩個Perl哈希值進行合併?
- 13. 如何在iPhone中忘記密碼忘記密碼
- 14. 我該如何'開火併忘記'JS功能? (不要等待返回)
- 15. Stackexchange.redis是否會啓動並忘記保證傳送?
- 16. Boost:啓動並忘記異步函數調用?
- 17. 如果我在合併之前忘記做git svn rebase,該怎麼辦?
- 18. 如何設置env變量並在C中啓動進程?
- 19. 如何啓動分離進程並等待父進程終止?
- 20. 如何「開火併忘記」WinForms表單?
- 21. 我應該如何在Perl中使用Catalyst進行RPC?
- 22. 如何在Windows中啓動另一個進程時啓動進程?
- 23. 如何在使用wsHttpBinding時在WCF中執行並忘記
- 24. 最快的方式來在PHP中啓動和忘記JSON POST
- 25. 如何從PHP啓動 - 停止perl守護進程
- 26. 如何從perl啓動程序?
- 27. 啓動進程並在之後回顯
- 28. 用於Python的最佳Cassandra 1.2驅動程序,我應該忘記CQL嗎?
- 29. 如何在後臺啓動服務並使用子進程並在文件中記錄日誌
- 30. 如果Quartz Scheduler死亡,我該如何阻止它啓動的子進程?
非常感謝,我沒有想過在命令中使用後臺shell操作符。那就是訣竅。不幸的是,我不能使用其他人,因爲我正在使用幾乎沒有模塊的嚴格限制系統。 – 2010-01-25 20:23:57
啊,沒錯,如果你用'&'char命令發出system()命令,它會立即返回,因此我建議的反標操作符方法並不好 - 最好使用Perl的系統調用而不是調用整個shell的新副本。 – 2010-01-25 23:28:50