2011-03-31 66 views
2

我需要重新加載魷魚守護進程,解決的辦法是:如何重新加載系統守護進程?

system("/etc/init.d/squid reload\n"); 

但我認爲必須有比使用「系統」呼叫更高效的解決方案,我應該用什麼C指令?

非常感謝。

+3

@Amber:'subprocess.call()'in * C *? – thkala 2011-03-31 07:39:31

+0

這實際上是python,不是嗎? – 2011-03-31 07:40:23

+0

這聽起來像是一種系統管理類型的任務,最好用更高級別的「腳本」語言而不是C來完成。 – 2011-03-31 07:57:02

回答

2

如果你真的需要更快的解決方案,你可以使用fork和exec,但是由於squid init腳本必須運行,並且squid必須完成這項工作,所以對C程序的任何優化只會給你一個很小的改進。

編輯:

在另一方面(在已搜索的魷魚手冊),一些守護程序作出反應的信號,和魷魚似乎這樣做。

kill(process-id-of-the-squid-dameon, SIGHUP); 
+0

就是這樣,現在我需要發現squid進程ID。非常感謝你。 – 2011-03-31 07:58:47

3

的絕對最快的方式有魷魚重新加載其配置文件將是一個SIGHUP signal發送到使用kill()守護進程:例如,如果你發送一個HUP信號,它重新讀取它的配置文件。這就是squid -k reconfigure所做的,而這又是/etc/init.d/squid reload最可能做的。

這種方法的問題是你必須以某種方式發現C代碼中的squid守護進程的進程ID。 PID通常存儲在/var/run(我的案例中爲/var/run/squid.pid)的某個文本文件中,您可以進行讀入操作,這樣可以節省查看流程表的麻煩,但它仍然有點混亂。

考慮到/etc/init.d/squid也可能正在執行自定義操作,並且您沒有義務每隔一秒左右重新加載守護進程,所以我會說您應該使用當前的解決方案。如果您不關心腳本的返回狀態,則還可以使用常見的fork()exec()方法,該方法是異步的,因此從應用程序的角度來看速度更快。