systemd服务如何允许kill -9 $MAINPID ?

我们公司需要用到阿里的办公安全平台SASE,我一直使用Linux办公的,我发现它提供了deb包,但是我是Manjaro用户,我将deb解包后重新打pkg.tag.zst包,发现这个程序在启动前,必须先执行/usr/local/bin/alisase-bin/3.4.2/alisasesvc --daemon启动一个守护进程,这行命令启动后有几个特点

1.运行命令后,程序会立刻退出,在后台fork出一个子进程守护运行
image.png
2.该进程运行后无法退出,只能通过kill -9 PID,它不接收其他信号,再就是运行/usr/local/bin/alisase-bin/3.4.2/alisasesvc --uninstall,但后者会将整个目录删除并卸载
3.由于这是个网络软件,会对本机的网络适配器产生影响,导致部分网段不能使用,会被代理到阿里云内网

我现在的需求是通过systemd来管理这个后台守护进程,方便我在不需要的时候通过systemctl stop alisase.service关闭,我现在的alisase.service长这样

[Unit]
Description=AliSASE Daemon Service
After=network-online.target nftables.service iptables.service

[Service]
Type=simple
ExecStart=/usr/local/bin/alisase-bin/alisased.sh start
ExecStop=/usr/local/bin/alisase-bin/alisased.sh stop
ExecReload=/usr/local/bin/alisase-bin/alisased.sh restart
PIDFile=/run/alisased.pid
KillSignal=SIGKILL
SuccessExitStatus=9

[Install]
WantedBy=multi-user.target

使用到的alisased.sh是这样

#!/usr/bin/env bash

runDir="/run";
pidFile="${runDir}/alisased.pid";

start() {
    if [ ! -d "${runDir}" ]; then
        mkdir -p /var/run;
    fi
    
    pid=$(pgrep -f alisasesvc);
    if [ -z "${pid}" ]; then
        /usr/local/bin/alisase-bin/3.4.2/alisasesvc --daemon
        pid=$(pgrep -f alisasesvc);
        echo "Start alisasesvc with pid ${pid} ."
    else
        echo "alisasesvc running with ${pid} ."
    fi

    echo "${pid}" > "${pidFile}";
}

stop() {
    if [ -f "${pidFile}" ] && [ -s "${pidFile}" ]; then
        pid=$(cat "${pidFile}");
    else
        pid=$(pgrep -f alisasesvc);
    fi

    if [ -n "${pid}" ] && ps -p "${pid}" > /dev/null; then
        echo "Stop alisasesvc with pid : ${pid} ...";
        kill -9 "${pid}";
    else
        echo "alisasesvc Stopped ${pid} !" 
    fi

    if [ -f "${pidFile}" ]; then
        rm "${pidFile}";
    fi
}

restart(){
    stop
    start
}

case "$1" in 
    "start")
        start;
    ;;
    "stop")
        stop;
    ;;
    "restart")
        restart;
    ;;
    *)
        echo "Invalid options .";
        exit 1
    ;;
esac

现在startstatus正常,但是stop时,提示使用了-9信号,引发systemd错误,但是我这个进程必须使用-9,没有其他停止方式
image.png

阅读 1.7k
2 个回答
✓ 已被采纳

与通义千问沟通后逐步尝试,已解决。
1.删除了alisased.sh
2.更改service文件内容如下

[Unit]
Description=AliSASE Daemon Service
After=network-online.target nftables.service iptables.service

[Service]
Type=forking
ExecStart=/usr/local/bin/alisase-bin/3.4.2/alisasesvc --daemon
KillSignal=SIGKILL
KillMode=mixed
SuccessExitStatus=0 1 255
RestartPreventExitStatus=

[Install]
WantedBy=multi-user.target

通义千问一周前询问是在胡说八道,这次的建议有用。腾讯元宝和字节豆包一直在一本正经的胡说🤥

systemd 也是支持fork子进程的,完全可以把aliased.sh去掉,类似这样:

[Unit]
Description=AliSASE Daemon Service
After=network-online.target nftables.service iptables.service

[Service]
Type=forking
ExecStart=/usr/local/bin/alisase-bin/3.4.2/alisasesvc --daemon
KillMode=mixed

[Install]
WantedBy=multi-user.target

上面的配置按理说应该可以直接用,当执行stop的时候,systemd会给子进程发送-9结束信号,和你的脚本实现的是一样的功能。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏