当前位置: 首页 > 知识库问答 >
问题:

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

沈子实
2024-09-29

我们公司需要用到阿里的办公安全平台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个答案

程俊力
2024-09-29

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结束信号,和你的脚本实现的是一样的功能。

 类似资料:
  • 我写了下面的代码- 在中 workflow.py- 和 但我犯了一个错误- FileWatcherSystemd.Service-FileChangeService loaded:loaded(/lib/systemd/system/FileWatcherSystemd.Service;enabled;vendor Preset:enabled)Active:inactive(dead)(结果:e

  • 我有一个Terraform用来管理我的云资源的服务帐户,我们称之为。我需要给予它足够的访问权限来创建/删除/编辑其他服务帐户,但不能更改它自己或项目中不应该接触的其他SAs。 我试着在那里添加一个条件,但看起来‘服务帐户’不是可以在条件(?)中使用的资源类型之一。下面是绑定该角色的HCL片段(我使用Terraform的事实与此无关): 当我删除该条件时,一切正常,但的权限远远超过它所需的权限。它甚

  • postgres不知道在哪里可以找到服务器配置文件。 必须指定--config-file或-d调用选项或设置PGDATA环境变量。 因此,我尝试设置配置文件: 我得到以下错误: 我搜索了这个错误消息,但找不到解决方案。 有人能对此提供一些见解吗?

  • 问题内容: 我目前正在使用在Oreo中崩溃的startWakefulService函数。我意识到我要么必须切换到startForegroundService()并使用前台服务,要么切换到JobIntentService,但是基于下面的代码,我不确定该怎么做。(对不起,我是android新手)。正确方向的任何观点将不胜感激。 这是在Android 8.x上运行时遇到的当前错误 致命异常:java.l

  • 这是在Android8.x上运行时出现的当前错误 致命异常:java.lang.RuntimeException无法启动接收方com.heyjude.heyjudeapp.gcm.gcmbroadcastreceiver:java.lang.illegalstateException:不允许启动服务意图{act=com.google.android.c2dm.Intent.receive flg=

  • 假设我的OpenAPI定义有两个服务器。两者共享相同的变量。因此,我想引用这些变量来防止重复代码。 是否可以引用服务器变量或以另一种方式重用它们? 当然,我可以运行,但我不想使用它。