Delphi開發Linux版的kbmMW Server


項目需要,必須在CentOS上運行應用服務器,不得矣,已經三天的時間,終於把windows版的kbmMW Server運行到CentOS上了。一路坎坷,Linux從0開始,多虧xalion等朋友們相助,能出了第一個結果。

很早就想嘗試用Linux做服務器,但遲遲沒得動手,想不到最終還是現實逼的迫不得矣,這三天,從安裝CentOS 7,再學習簡單的命令,搭建Delphi環境,編譯輸出應用到Linux上運行,每一步都是卡,必竟從0開始...

xalion建議我說用Ubuntu,他就是在這上面做的,而我想用戶只給我CentOS,所以我想還是嘗試用CentOS,雖然一路艱難,這三天終於有了初步的結果,感覺還好。

現在總結一下遇到的問題:

1.編譯出錯:

 

 出這個錯的原因是少了開發庫libcurl,在CentOS上終端上,用root用戶執行:

yum install libcurl4-gnutls-dev
yum install p7zip-full
yum install libcurl
yum install libcurl-devel
yum install zlib-devel

//執行完這些,然后重新下載 sdk 

感謝此文【Delphi 下開發編譯 Linux 程序教程全過程, 圖文並茂詳解】作者告訴解決方法。

2.在服務端中止(退出)應用服務器卡死

應用服務器一但被訪問了,當執行kbmMWServer.Active卡死了。跟蹤代碼,發現是Indy的問題造成的,換成TCPServerTransport正常。

3.打不開sqlite數據庫文件

我用了一個sqlite存系統的設置參數,通過uniDAC訪問這個數據庫。在PAServer中運行正常,但獨立運行時,顯示打不開數據庫文件。最后查明,當獨立運行時,取到的是相對路徑,最后用下面的代碼,得到絕對路徑。

  filepath := IncludeTrailingPathDelimiter(TPath.GetDirectoryName(TPath.GetFullPath(ParamStr(0)))) + 'config.db3';

上面代碼,先通過命令行參數,通過GetFullPath取得完整的路徑,再用GetDirectoryName取得路徑名稱,這時候是一個完整的路徑了,然后再組合成含有數據庫文件名的數據庫文件路徑。

結論,uniDAC要用完整的數據庫文件的路徑,才能打開SQLite數據庫。當然,這是Linux下要這么處理,對於Windows來說不存這個問題。

4.編譯錯誤:System error:Text file busy

 這個原因在linux上應用正在運行,退出應用即可。如果無界面,可以殺死進程序:

 如上圖,執行ps -a 列出進程,然后用kill 12792

干掉指定的進程。

5.文件服務出錯:

 

 原來在帶GUI的應用服務器上,是正常的,轉到CONSOLE上出這個錯誤。

看了一下,原來FileService的FilePool是在設計期指定的,改到動行期指定:

 

上圖設計期指定的FilePool,改成代碼指定:

procedure TFileService.kbmMWFileServiceCreate(Sender: TObject);
begin
  Self.FilePool:=MainDatamodule.kbmMWFilePool1;
end;

OK,這個問題算是解決快的。

kbmMW 5.10.20在linux下,FileService讀取文件有bug,需要用xalion改的文件。我在這個問題上又浪費幾個小時,本來xalion之前就告訴我的,要用他改的文件。

6.開啟防火牆

增加paserver的訪問端口並reload

firewall-cmd --add-port=64211/tcp --permanent
firewall-cmd --reload

 7.快速查看Centos7系統日志

8.重載服務

systemctl daemon-reload

 這個命令很重要,如果把服務從一個目錄部署到另外的目錄,修改完后,一定要執行一下這個命令。

我遇到這個問題,查了三個半小時,原來是這個原因。出的錯誤是:

進一步查系統日志,是這個錯誤:

 

上圖,/usr/yh/kserver是我原來部署的目錄,換到/home/yh/kserver后,出的錯誤。就是說 /usr/yh/kserver是不存在的。

記得用命令 systemctl daemon-reload ,就搞定了!

我的生命啊!就這樣,又沒了幾個小時。

10.CentOS7設置共享文件夾

11.竹子遇到這個錯誤提示 /PAServer-20.0/linuxgdb: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

解決方案

 

su root
sudo yum install ncurses* 
環境:centos8

12 Linux下kbmmw 服務器的開機自動啟動

這個xalion寫的文章,必讀! 我參考xalion寫的,在centos上,有所差別,把kserver.service復制到目錄/usr/lib/systemd/system,然后就可以systemctl start kserver.service了。

配置自啟動服務,按下面操作:

//進入
cd /etc/systemd/system/multi-user.target.wants,
//建立自啟動服務聯接文件:
ln -s /usr/lib/systemd/system /kserver.service kserver.service

 

13.竹子建議用SecureCRT

SecureCRT是一款支持SSH(SSH1和SSH2)的終端仿真程序,簡單地說是Windows下登錄UNIX或Linux服務器主機的軟件。

14.ide 無法聯接paserver

產生這個問題,可能的原因有三個:

1.在linux上要運行paserver

2.防火牆要打開64211端口,記得重新設置防火牆后要reload一下才能生效。

3.ide要允許訪問網絡,這是竹子遇到的情況

當然,在ide中設置正確的ip及端口是必須的。

15.centos 7關閉系統休眠

長時間不工作,網卡會自動休眠,動動鼠標或者鍵盤又能重新聯網。
解決方法:vi /etc/default/grub (centons7之前的系統,路徑為vi /etc/grub.conf)
添加pcie_aspm=off 重啟,該方法是關閉電源管理系統,防止休眠。

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

pcie_aspm=off

 


免責聲明!

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



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