Mil*_*vić 6 security process kill shell-script resources
我在想是否有“规范”的方式来拥有这个?
我必须在实时服务器上安装一些程序。尽管我确实信任供应商(FOSS、Github、多个作者......),但我宁愿确保避免脚本陷入某些麻烦并耗尽系统资源并使服务器无响应的情况并非完全不可能。我有一个安装 amavis 的案例,它是在之后立即启动的,由于一些杂乱的配置,它产生了 >4 的 loadavg 并且系统几乎没有响应。
我第一次教的是nice
- nice -n 19 thatscript.sh
。这可能有帮助,也可能无济于事,但我认为最好编写和激活脚本来执行以下操作:
作为守护进程运行,在(示例)500ms-2s
使用ps
和检查标记的进程grep
如果标记的进程(或任何其他进程)占用太多 CPU(尚未定义) - 用 SIGKILL
我的第二个教导是 - 这不是我第一次重新发明轮子。
那么,有没有什么好的方法可以将程序和它产生的进程“囚禁”到一些预定义的有限系统资源中,或者如果它们达到某个阈值则自动杀死?
备选方案 1:使用 monit 监控您的流程
安装M/Monit并基于此模板创建配置文件:
check process myprogram
matching "myprogram.*"
start program = "/usr/bin/myprogram" with timeout 10 seconds
stop program = "/usr/bin/pkill thatscript"
if cpu > 99% for 2 cycles then stop
if loadavg (5min) > 80 for 10 cycles then stop
Run Code Online (Sandbox Code Playgroud)
替代方案 #2:使用 cgroups 限制进程 CPU 使用率
最原生的 Linux 特定解决方案。提供了很多选择和复杂性。
例子:
sudo cgcreate -g cpu:/cpulimited
sudo cgset -r cpu.shares=512 cpulimited
sudo cgexec -g cpu:cpulimited /usr/bin/myprogram > /dev/null &
Run Code Online (Sandbox Code Playgroud)
我鼓励您阅读更多内容:
DigitalOcean - 操作方法:在 CentOS 6 上使用 cgroups 限制资源
替代方案 #3:使用 cpulimit 限制进程 CPU 使用率
从您选择的包管理器获取最新版本的 cpulimit,或通过在GitHub 上获取源代码。
将 CPU 使用率限制为 90%: cpulimit -l 90 /usr/bin/myprogram > /dev/null &
边注:
您还可以固定某个进程以使用某些 CPU 内核,以确保您始终拥有一些可用的 CPU 功率。
systemd
可以限制目标/服务的资源。从man
页面:
为执行的进程分配指定的 CPU 时间配额。采用百分比值,后缀为“%”。该百分比指定了该单元最多可获得多少 CPU 时间,相对于一个 CPU 上可用的总 CPU 时间。使用 > 100% 的值在多个 CPU 上分配 CPU 时间。这控制了
cpu.max
统一控制组层次结构上的“ ”属性和cpu.cfs_quota_us
遗留的“ ”属性。有关这些控制组属性的详细信息,请参阅cgroup-v2.txt
和sched-design-CFS.txt
。示例:
CPUQuota=20%
确保执行的进程在一个 CPU 上的 CPU 时间永远不会超过 20%。表示“
CPUAccounting=true
”。
因为使用它意味着CPUAccounting
我也会包括它
开启本机的 CPU 使用率统计。接受一个布尔参数。请注意,打开一个单元的 CPU 占用也会隐式地为同一片中包含的所有单元及其所有父片和其中包含的单元打开它。此设置的系统默认值可以用
DefaultCPUAccounting=
in控制systemd-system.conf(5)
。
我也会引用自Slice
:
放置单元的切片单元的名称。默认
system.slice
为所有单元类型的所有非实例化单元(切片单元本身除外,见下文)。实例单元默认放置在system.slice
以模板名称命名的子切片中。
所以默认情况下,所有东西都会被扔进同一个slice
,这意味着所有东西都在一个资源池中。
还有MemoryHigh
要看的:
指定本单元中已执行进程的内存使用上限。如果不可避免,内存使用量可能会超过限制,但在这种情况下,进程会严重减慢并且内存会被主动占用。这是控制单元内存使用的主要机制。
以字节为单位获取内存大小。如果该值以 K、M、G 或 T 为后缀,则指定的内存大小将分别解析为千字节、兆字节、千兆字节或兆兆字节(以 1024 为基数)。或者,可以指定一个百分比值,该值相对于系统上安装的物理内存。如果分配了特殊值“无穷大”,则不会应用内存限制。这控制“
memory.high
”控制组属性。有关此控制组属性的详细信息,请参见cgroup-v2.txt
。表示“
MemoryAccounting=true
”。仅当使用统一控制组层次结构并禁用 时,才支持此设置
MemoryLimit=
。
您可以轻松地将脚本放入systemd
服务中。
假设/usr/local/thatscript.sh
是脚本:
/usr/lib/systemd/system/thatscript.service
[Unit]
Description=This runs "thatscript"
ConditionFileNotEmpty=/usr/local/thatscript.sh
[Service]
Type=simple
ExecStart=/usr/local/thatscript.sh
CPUQuota=20%
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
然后你需要systemctl daemon-reload
读入新的服务文件,systemctl enable thatscript.service
如果你想让它在启动时运行,或者systemctl start thatscript.service
你想手动启动它,你就可以。