[英]How do you know if syslog-ng stops your listening daemon?
我寫了一個掛鈎到syslog-ng
(通過syslog-ng.conf
)的PHP程序,基本上是這樣的:
while (!feof(STDIN)) {
$input = fgets(STDIN);
process($input);
}
cleanup();
其中process()
和cleanup()
由我定義。
我面臨的問題是從不調用cleanup(2)
,我需要在程序退出之前執行它。
我試圖使用pcntl_signal()
捕獲SIGTERM,SIGHUP和SIGPIPE,並且該部分應用程序似乎工作正常(如果我在PHP進程中使用kill -1,我的信號處理程序被調用並運行cleanup()
),但是看來我沒有收到syslog-ng的那些消息。
我已經嘗試將STDIN設置為非阻塞,認為PHP不會調用信號處理程序,因為流阻塞了。 這也不起作用,我的信號處理程序不會被調用。
我怎么知道syslog-ng什么時候停止我的應用程序,所以我可以做一些清理工作?
謝謝,湯姆
更新:我試圖捕獲所有信號,從1到31,當syslog-ng重新啟動(或使用SIGTERM殺死)時仍然沒有收到任何信號。
也許嘗試將cleanup()
注冊為PHP 關閉函數 ,如下所示:
function cleanup(){}
register_shutdown_function("cleanup");
從理論上講,這將導致php在退出之前執行該功能。 當使用強制暫停選項(如殺戮)時,這可能不起作用,所以它是(又一次)在黑暗中拍攝。
我希望你找到一些有用的東西。 我也有興趣了解結果。
編輯:我很高興這對你有用!
這是一個黑暗中的鏡頭,但嘗試重寫你的循環如下:
do {
$input = fgets(STDIN);
process( $input );
while ( !feof( STDIN ) ) {
cleanup();
想法是當syslog-ng關閉stdout時(假設確實如此?),fgets將嘗試讀取並實際達到EOF。
在沒有正確清理的情況下突然終止PHP腳本可能是因為發生了運行時錯誤(例如,因為你的process()還沒有准備好處理fgets()在到達EOF時返回的空字符串)。
啟用PHP錯誤日志記錄以查看發生的情況。
我可以想到一些你可以嘗試解決這個問題的事情:
1)使用PHP的set_error_handler()函數 。
2)將上面提到的代碼放在try / catch結構中,嘗試捕獲可能引發的異常。
3)運行該腳本時,請確保捕獲輸出和標准錯誤。 將命令行更改為:
/path/to/script 2>&1 >> /path/to/logfile.txt
...這將幫助您發現錯誤。
最后,如果確實是PHP無法捕獲信號的情況,則必須通過帶有trap命令的shell腳本執行此操作。 就像是:
#!/bin/sh
#
# This gets run when the script is hit with a signal
#
trap /path/to/script --cleanup
#
# Run our script
#
/path/to/script 2>&1 >> /path/to/logfile.txt
如果腳本中有cleanup()需要的特定數據,那么您將不得不看到有關序列化數據並將其寫入磁盤以供清理腳本讀取的信息。
祝好運!
PHP是否為您精心處理您的信號? 嘗試用您可以控制的另一種語言進行原型設計。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.