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循环检测进程的脚本)
这类脚本一般靠进程名或可执行文件路径判断是否重启。你可以:- 先杀掉当前进程:
kill -9 $(pidof your-target-process) - 把目标进程的二进制文件重命名:
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.targetsystemctl 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




