項目需要,必須在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
8.重載服務
systemctl daemon-reload
這個命令很重要,如果把服務從一個目錄部署到另外的目錄,修改完后,一定要執行一下這個命令。
我遇到這個問題,查了三個半小時,原來是這個原因。出的錯誤是:
進一步查系統日志,是這個錯誤:
上圖,/usr/yh/kserver是我原來部署的目錄,換到/home/yh/kserver后,出的錯誤。就是說 /usr/yh/kserver是不存在的。
記得用命令 systemctl daemon-reload ,就搞定了!
我的生命啊!就這樣,又沒了幾個小時。
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
這個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