使用delphi 10.2 開發linux 上的Daemon


   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 已經不在了,整個世界清靜了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM