我們一般在編寫伺服器的時候都希望能讓伺服器在後台執行,而且能記錄下這個伺服器的pid,防止乙個程序重複啟動。之前我的方案是自己使用fork函式,將伺服器執行成後台模式;並且在啟動之前去檢查配置檔案中指定的pid檔案中是否能讀出pid資訊,並且在當前的ps aux中查詢這個pid的程序是否還活著。這樣來判定伺服器是否已經啟動了。當正常啟動完畢之後,將會把當前程序的pid寫入檔案。這樣就能防止重複啟動了。從剛剛的描述中可以看出其實大多的伺服器程式可能需要有以下幾個需求:
需要後台執行
需要記錄pid方便今後伺服器資訊的讀取
需要防止伺服器被錯誤的重複啟動
其實在linux的基礎設施中有這樣類似的命令來處理:
$ daemon
有了這個活寶,可以減少自己去學習linux那套daemon方式的程式設計。在寫程式的時候直接實現自己的伺服器主流程即可。這種減少掉自己**中的平台相關的東西還是比較好。能讓**更加清晰。
daemonize可以將乙個命令執行成unix的後台。後台程式是不需要借助終端或者登陸的shell執行在伺服器上的,並且等待一些時間的出現,或者等待去執行一些規定的任務在一定週期內。乙個典型的後台程式江湖:
關閉全部檔案描述字(除開標準輸出、輸出和錯誤輸出)掛載到輸出檔案,而不是沖掉預設值。只有應用了-e and/or -o 被指定的情況。將工作目錄設定成檔案系統的root目錄,確保它沒有掛載任何其他的檔案系統,預防它被解除安裝
重設他的umask
執行在後台(fork)
分離處理組(通常是乙個shell),隔絕掉訊號(如掛起訊號hup);
忽略掉全部中斷的i/o訊號
從中斷分離控制權
處理任何sigcld訊號
重定向輸出標準錯誤到指定的檔案中,替代/dev/null
重定向輸出標準到指定的檔案中,替代/dev/null
增加環境變數給給後台程式。這個這個引數型別一定要是name=value格式。引數可以設定多次。
定製執行命令前的目錄。
定製自己的pid存放位置。
單例項啟動時將會檢查這個檔案。
定製程式以誰的身份執行的。
將會觸發daemonize將自己程式的執行詳細的日誌輸出到標準輸出中。
如果宿主作業系統提供了daemon庫程式,daemonize 將會使用它。否則 daemonize將使用自己實現的daemon。這個選擇是在編譯期做的。
freebsd 5.0引入了daemon命令類似於這個命令,但是沒有提供如此多的功能。
august 2006
#include
#include
int main( int argn, char *ar** )
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
if ( loop_count == 5 )
if ( loop_count == 9 )
}
return 0;
}
daemonize -a -e /home/abel/test_daemonize/error.log -o /home/abel/test_daemonize/output.log -p /home/abel/test_daemonize/daeminze.pid -l /home/ab el/test_daemonize/lockfile /home/abel/test_daemonize/test_daemonize -c mycfg.cfg
test_daemonize]$ ls
daeminze.pid error.log launch.sh lockfile main.cpp main.o output.log sconstruct test_daemonize
$ cat ./daeminze.pid
11520
# output.log
is normalize output
is normalize output
# error.log
is error output
Linux守護程序執行命令daemonize
我們一般在編寫伺服器的時候都希望能讓伺服器在後台執行,而且能記錄下這個伺服器的pid,防止乙個程序重複啟動。之前我的方案是自己使用fork函式,將伺服器執行成後台模式 並且在啟動之前去檢查配置檔案中指定的pid檔案中是否能讀出pid資訊,並且在當前的ps aux中查詢這個pid的程序是否還活著。這樣...
後台執行命令 守護程序建立
當你在終端或控制台工作時,可能不希望由於執行乙個作業而佔住了螢幕,因為可能還有更重要的事情要做,比如閱讀電子郵件。對於密集訪問磁碟的程序,你可能希望它能夠在每天的非負荷高峰時間段執行。為了使這些程序能夠在後台執行,也就是說不在終端螢幕上執行,有幾種選擇方法可供使用 list 設定crontab檔案,...
mac php fpm 守護程序執行
問題是沒有開啟守護程序執行,php fpm的時候出現 ready to handle connections 關閉命令列視窗後又斷開了 php fpm ready to handle connections 2 檢視php fpm配置檔案,因為php fpm配置檔案有乙個選項是 daemonize ...