20250909更新
// 👇 定义一个空的信号处理过程(必须 cdecl!)
procedure SignalSIGPIPEHandler(sig: longint); cdecl;
begin
// 什么也不做,表示“忽略”
end;
procedure SignalSIGHUPHandler(sig: longint); cdecl;
begin
// 什么也不做,表示“忽略”
end;
procedure SignalKillHandler(sig: longint); cdecl;
begin
//处理退出前
Halt(0);
end;
gin
pid := FpFork;
if pid = 0 then
begin
//忽略终端挂断
fpSignal(SIGPIPE, @SignalSIGPIPEHandler); //作用:防止“写入已关闭连接”导致进程崩溃
fpSignal(SIGHUP, @SignalSIGHUPHandler); //防止“终端关闭”导致进程退出
fpSignal(SIGTERM, @SignalKillHandler);//优雅关闭进程(比如 systemctl stop 或 kill 命令)比如 kill 1234 # ← 会触发 SignalHandler,优雅关闭服务
//fpSignal(SIGINT, @SignalHandler); //处理 Ctrl+C 中断
end;
注意如果使用
if (fpkill(StrToInt(TextPid), SIGTERM) = 0) then //这里要用SIGTERM,不要用SIGKILL 用这个不会触发SIGTERM事件
begin //杀死进程成功
end
用kill 进程号 是没有问题的。
===============================================
{$IFDEF LINUX}
,BaseUnix
{$ENDIF }
var
pid:TPid;
//在主程序中加入
begin
{$IFDEF LINUX}
pid:=FpFork;
if pid=0 then
begin
{$ENDIF }
//后台运行的部分
{$IFDEF LINUX}
end;
{$EndIf}
end;
这样在命令行运行程序时,就会自动又回到控制台,接着进行其它工作。而程序在后台运行。
浙公网安备 33010602011771号