標籤:osi 運行 避免 target 今天 project http 功能 response
delphi 10.2 支援linux, 而且官方只是支援命令列編程,目地就是做linux 伺服器端的開發。
既然是做linux伺服器端的開發,那麼普通的命令列運行程式,然後等待開一個黑視窗的方式就
太low了(目前就有個別語言大咖,經常在Windows 上開個黑視窗,看起來非常噁心),那麼如果
避免這個尷尬的問題?
其實Linux 下也有類似windows 服務的功能,Linux Daemon 就是其中的一種方式,命令列運行後
直接返回,同時在後台建立一個同樣的進程。接受用戶端的訪問。常見的一些linux 服務基本上都是
這樣工作的。例如著名apache,mysql 等。具體的linux Daemon 的介紹,請參照本篇文章。
今天我們就使用delphi 來開發一個背景http server, 來說明delphi 如何開發linux 的Daemon.
建立工程,建一個控制台應用。
因為這個只能在linux 運行,所以直接加入linux 支援。
因為我們要做http server, 要放一些控制項,因此再加一個datamodule.
然後在datamodule 上放一個Tidhttpserver 控制項。
在oncommandget 裡面加入以下事件。
procedure Tdmf.IdHTTPServer1CommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);begin AResponseInfo.ContentText:=‘I am delphi for linux service‘;end;
好了。
我們回到工程檔案
輸入以下代碼
program Project2;{$APPTYPE CONSOLE}{$R *.res}uses Posix.Unistd, Posix.SysTypes, System.SysUtils, dmp in ‘dmp.pas‘ {dmf: TDataModule};procedure daemon;begin dmf:=Tdmf.Create(nil); dmf.IdHTTPServer1.Active:=True; try repeat sleep(10 * 1000); until False; finally dmf.Free; end;end;var pid: pid_t;begin pid := fork; if pid = 0 then begin writeln(‘starting service‘); daemon; end;end.
編譯運行。
首先我們看一下系統中的運行進程: ps -ef
裡面沒有Project2 的任何資訊。
我們運行這個程式
運行完後,程式立即就返回了
我們在看看系統進程裡面的情況
我們可以看見這個Project2 依然在進程中。
那麼這個進程是否可以正常工作呢?
我們開啟瀏覽器,看看情況如何?
可以看見這個這個程式在後面啟動並執行非常正常。
當然了,由於這是一個demo, 我沒有做太多的處理,其實由於daemon 進程無法與前台直接互動,我們以後寫這種應用時。
應該多用 日誌 檔案來記錄運行情況,一般出問題時,能夠快速的找到問題的根源。
那麼這個程式一直在後台運行,我們再次編譯和發布時,就沒辦法覆蓋了,怎麼關掉這個後台進程呢?
辦法很簡單,也很粗暴(反正我喜歡)。
使用linux 的kill 命令。
找到該應用的pid, 直接幹掉
然後使用ps -ef 看看
Project2 已經不在了,整個世界清靜了。
使用delphi 10.2 開發linux 上的Daemon