Delphi开发Linux版的kbmMW Server
<p>项目需要,必须在CentOS上运行应用服务器,不得矣,已经三天的时间,终于把windows版的kbmMW Server运行到CentOS上了。一路坎坷,Linux从0开始,多亏xalion等朋友们相助,能出了第一个结果。</p><p>很早就想尝试用Linux做服务器,但迟迟没得动手,想不到最终还是现实逼的迫不得矣,这三天,从安装CentOS 7,再学习简单的命令,搭建Delphi环境,编译输出应用到Linux上运行,每一步都是卡,必竟从0开始...</p>
<p>xalion建议我说用Ubuntu,他就是在这上面做的,而我想用户只给我CentOS,所以我想还是尝试用CentOS,虽然一路艰难,这三天终于有了初步的结果,感觉还好。</p>
<p>现在总结一下遇到的问题:</p>
<p>1.编译出错:</p>
<p> <img src="https://img2020.cnblogs.com/blog/367202/202004/367202-20200427124359923-593605175.png"></p>
<p> 出这个错的原因是少了开发库libcurl,在CentOS上终端上,用root用户执行:</p>
<div class="cnblogs_code">
<pre>yum install libcurl4-gnutls-<span style="color: rgba(0, 0, 0, 1)">dev
yum install p7zip</span>-<span style="color: rgba(0, 0, 0, 1)">full
yum install libcurl
<strong>yum install libcurl</strong></span><strong>-</strong><span style="color: rgba(0, 0, 0, 1)"><strong>devel</strong>
yum install zlib</span>-<span style="color: rgba(0, 0, 0, 1)">devel
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">执行完这些,然后重新下载 sdk </span></pre>
</div>
<p>感谢此文【Delphi 下开发编译 Linux 程序教程全过程, 图文并茂详解】作者告诉解决方法。</p>
<p>2.在服务端中止(退出)应用服务器卡死</p>
<p>应用服务器一但被访问了,当执行kbmMWServer.Active卡死了。跟踪代码,发现是Indy的问题造成的,换成TCPServerTransport正常。</p>
<p>3.打不开sqlite数据库文件</p>
<p>我用了一个sqlite存系统的设置参数,通过uniDAC访问这个数据库。在PAServer中运行正常,但独立运行时,显示打不开数据库文件。最后查明,当独立运行时,取到的是相对路径,最后用下面的代码,得到绝对路径。</p>
<div class="cnblogs_code">
<pre>filepath := IncludeTrailingPathDelimiter(TPath.GetDirectoryName(TPath.GetFullPath(ParamStr(<span style="color: rgba(128, 0, 128, 1)">0</span>)))) + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">config.db3</span><span style="color: rgba(128, 0, 0, 1)">'</span>;</pre>
</div>
<p>上面代码,先通过命令行参数,通过GetFullPath取得完整的路径,再用GetDirectoryName取得路径名称,这时候是一个完整的路径了,然后再组合成含有数据库文件名的数据库文件路径。</p>
<p>结论,uniDAC要用完整的数据库文件的路径,才能打开SQLite数据库。当然,这是Linux下要这么处理,对于Windows来说不存这个问题。</p>
<p>4.编译错误:System error:Text file busy</p>
<p><img src="https://img2020.cnblogs.com/blog/367202/202004/367202-20200428135026124-870117543.png"></p>
<p> 这个原因在linux上应用正在运行,退出应用即可。如果无界面,可以杀死进程序:</p>
<p><img src="https://img2020.cnblogs.com/blog/367202/202004/367202-20200428135849149-365387071.png"></p>
<p> 如上图,执行ps -a 列出进程,然后用kill 12792</p>
<p>干掉指定的进程。</p>
<p>5.文件服务出错:</p>
<p><img src="https://img2020.cnblogs.com/blog/367202/202004/367202-20200428142350393-349733148.png"></p>
<p> </p>
<p> 原来在带GUI的应用服务器上,是正常的,转到CONSOLE上出这个错误。</p>
<p>看了一下,原来FileService的FilePool是在设计期指定的,改到动行期指定:</p>
<p><strong><img src="https://img2020.cnblogs.com/blog/367202/202004/367202-20200428142529795-1857374721.png"></strong></p>
<p> </p>
<p>上图设计期指定的FilePool,改成代码指定:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TFileService.kbmMWFileServiceCreate(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Self.FilePool:</span>=<span style="color: rgba(0, 0, 0, 1)">MainDatamodule.kbmMWFilePool1;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>OK,这个问题算是解决快的。</p>
<p>kbmMW 5.10.20在linux下,FileService读取文件有bug,需要用xalion改的文件。我在这个问题上又浪费几个小时,本来xalion之前就告诉我的,要用他改的文件。</p>
<p>6.开启防火墙</p>
<p>增加paserver的访问端口并reload</p>
<div class="cnblogs_code">
<pre>firewall-cmd --add-port=<span style="color: rgba(128, 0, 128, 1)">64211</span>/tcp --permanent</pre>
</div>
<div class="cnblogs_code">
<pre>firewall-cmd --reload</pre>
</div>
<p> 7.快速查看Centos7系统日志</p>
<p>8.重载服务</p>
<div class="cnblogs_code">
<pre>systemctl daemon-reload</pre>
</div>
<p> 这个命令很重要,如果把服务从一个目录部署到另外的目录,修改完后,一定要执行一下这个命令。</p>
<p>我遇到这个问题,查了三个半小时,原来是这个原因。出的错误是:</p>
<p><img src="https://img2020.cnblogs.com/blog/367202/202004/367202-20200429212249314-1097066561.png"></p>
<p>进一步查系统日志,是这个错误:</p>
<p><img src="https://img2020.cnblogs.com/blog/367202/202004/367202-20200429212324016-1439009719.png"></p>
<p> </p>
<p>上图,/usr/yh/kserver是我原来部署的目录,换到/home/yh/kserver后,出的错误。就是说 /usr/yh/kserver是不存在的。</p>
<p>记得用命令 <strong>systemctl daemon-reload</strong> ,就搞定了!</p>
<p>我的生命啊!就这样,又没了几个小时。</p>
<p>10.CentOS7设置共享文件夹</p>
<p>11.竹子遇到这个错误提示 /PAServer-20.0/linuxgdb: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory</p>
<p>解决方案</p>
<p> </p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">su root
sudo yum install ncurses</span>*<span style="color: rgba(0, 0, 0, 1)">
环境:centos8</span></pre>
</div>
<p>12 Linux下kbmmw 服务器的开机自动启动</p>
<p>这个xalion写的文章,必读! 我参考xalion写的,在centos上,有所差别,把kserver.service复制到目录<strong>/usr/lib/systemd/system,然后就可以systemctl start kserver.service</strong>了。</p>
<p>配置自启动服务,按下面操作:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进入</span>
cd /etc/systemd/system/multi-<span style="color: rgba(0, 0, 0, 1)">user.target.wants,
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">建立自启动服务联接文件:</span>
ln -s /usr/lib/systemd/system /kserver.service kserver.service</pre>
</div>
<p> </p>
<p>13.竹子建议用SecureCRT</p>
<p>SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件。</p>
<p>14.ide 无法联接paserver</p>
<p>产生这个问题,可能的原因有三个:</p>
<p>1.在linux上要运行paserver</p>
<p>2.防火墙要打开64211端口,记得重新设置防火墙后要reload一下才能生效。</p>
<p>3.ide要允许访问网络,这是竹子遇到的情况</p>
<p>当然,在ide中设置正确的ip及端口是必须的。</p>
<p>15.centos 7关闭系统休眠</p>
<p>长时间不工作,网卡会自动休眠,动动鼠标或者键盘又能重新联网。<br>
解决方法:<strong>vi /etc/default/grub</strong> (centons7之前的系统,路径为vi /etc/grub.conf)<br>
添加<strong>pcie_aspm=off</strong>重启,该方法是关闭电源管理系统,防止休眠。</p>
<div class="cnblogs_code">
<pre>GRUB_TIMEOUT=<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">
GRUB_DISTRIBUTOR</span>="$(sed <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s, release .*$,,g</span><span style="color: rgba(128, 0, 0, 1)">'</span> /etc/system-<span style="color: rgba(0, 0, 0, 1)">release)"
GRUB_DEFAULT</span>=<span style="color: rgba(0, 0, 0, 1)">saved
GRUB_DISABLE_SUBMENU</span>=<span style="color: rgba(0, 0, 0, 1)">true
GRUB_TERMINAL_OUTPUT</span>=<span style="color: rgba(0, 0, 0, 1)">"console"
GRUB_CMDLINE_LINUX</span>="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/<span style="color: rgba(0, 0, 0, 1)">swap rhgb quiet"
GRUB_DISABLE_RECOVERY</span>=<span style="color: rgba(0, 0, 0, 1)">"true"
pcie_aspm</span>=off</pre>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/kinglandsoft/p/12782201.html
頁:
[1]