You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux技术问题:如何终止持续重启进程且不影响监控进程及进程黑名单设置

问题1:如何在不终止监控进程的前提下,杀死会持续重启的目标进程?

这得先看你的目标进程是被哪种监控系统托管的,不同工具对应不同的处理方式:

  • 如果是systemd管理的进程(最常见场景)
    先停掉当前运行的进程,再直接禁用它的自动重启机制,全程不碰systemd这个监控进程本身:

    # 停止当前正在运行的目标进程
    systemctl stop your-target-process.service
    # 彻底禁止该服务被自动启动(包括systemd的监控重启触发)
    systemctl mask your-target-process.service
    

    解释下:mask命令会把服务的配置文件链接到/dev/null,systemd还会正常运行,但再也不会尝试启动这个被屏蔽的服务了。之后要恢复的话,用systemctl unmask即可。

  • 如果是Supervisord托管的进程
    先停进程,再修改配置关掉自动重启:

    # 停止目标进程
    supervisorctl stop your-target-process
    # 临时禁用自动重启(重启supervisord后失效)
    supervisorctl update your-target-process autostart=false
    # 要永久生效的话,编辑supervisord的配置文件,把对应进程的autostart改成false,然后重载配置
    supervisorctl reload
    
  • 如果是自定义监控脚本(比如while循环检测进程的脚本)
    这类脚本一般靠进程名或可执行文件路径判断是否重启。你可以:

    1. 先杀掉当前进程:kill -9 $(pidof your-target-process)
    2. 把目标进程的二进制文件重命名:mv /path/to/your-target-process /path/to/your-target-process.bak
      这样监控脚本下次检测时找不到可执行文件,就没法重启了,而监控脚本本身还会继续运行(只要它没额外的崩溃逻辑)。

问题2:在Linux操作系统中,是否存在将指定进程加入某种“黑名单”的可行方法?

当然有,具体要看你对“黑名单”的需求是阻止进程启动还是启动后立即杀死,这里给你几种实用方案:

方案1:彻底阻止进程启动

  • systemd屏蔽服务:如果进程是systemd服务,直接用systemctl mask your-process.service,和问题1里的逻辑一样,彻底禁止systemd启动它。
  • 文件层面锁死:找到进程的可执行文件,用chattr +i /path/to/executable给文件加不可修改属性,这样包括root在内的所有用户都没法执行它(除非先去掉属性);或者把文件权限改成000,让所有用户都没有执行权限。
  • 强制访问控制(AppArmor/SELinux):编写规则禁止指定程序执行,比如AppArmor可以创建一个专属profile,拒绝该程序的execute权限,适合复杂的权限管控场景。

方案2:进程启动后自动杀死

  • 用systemd做实时监控:创建一个简单的systemd服务,定时检查并杀死黑名单进程:
    先创建/etc/systemd/system/kill-blacklist.service文件:
    [Unit]
    Description=Kill blacklisted processes automatically
    
    [Service]
    Type=simple
    ExecStart=/bin/sh -c "while true; do pkill -f 'your-blacklist-process-name'; sleep 5; done"
    
    [Install]
    WantedBy=multi-user.target
    
    然后启动并设置开机自启:
    systemctl daemon-reload
    systemctl start kill-blacklist.service
    systemctl enable kill-blacklist.service
    
  • cron定时任务:添加一个每分钟执行的定时任务,检查并杀死指定进程:
    执行crontab -e,添加一行:
    * * * * * pkill -f 'your-blacklist-process-name' > /dev/null 2>&1
    

方案3:限制特定用户启动进程

如果是要阻止某个用户启动目标进程,可以用pam_exec模块,在/etc/pam.d/common-auth或对应的session配置文件中添加规则,当用户尝试执行指定程序时直接拒绝操作。


内容的提问来源于stack exchange,提问作者fûX

火山引擎 最新活动