我正在pdftoppm将用户提供的 PDF 转换为 300DPI 图像。这很好用,除非用户提供页面非常大的 PDF。 pdftoppm将分配足够的内存来在内存中保存该大小的 300DPI 图像,对于 100 英寸的方形页面,它是 100*300 * 100*300 * 4 字节/像素 = 3.5GB。恶意用户可以给我一个愚蠢的大 PDF 并导致各种问题。
所以我想做的是对我即将运行的子进程的内存使用设置某种硬限制——如果它试图分配超过 500MB 的内存,就让进程死掉。那可能吗?
我不认为 ulimit 可以用于此,但是否有一个等价的进程?
更改是否/etc/security/limits.conf需要重新启动才能生效?
例如,如果我有一个在 中设置以下限制的脚本/etc/security/limits.conf,是否需要重新启动系统才能使这些限制生效?
* hard nofile 94000
* soft nofile 94000
* hard nproc 64000
* soft nproc 64000
Run Code Online (Sandbox Code Playgroud) ulimit 中的硬限制和软限制有什么区别?
对于打开文件的数量,我的软限制为 1024,硬限制为 10240。可以运行打开超过 1024 个文件的程序。什么是软限制?
在小牛队之前,我可以使用/etc/launchd.conf文件来改变最大系统资源消耗,例如:
limit maxfiles 16384 unlimited
limit maxproc 16384 unlimited
Run Code Online (Sandbox Code Playgroud)
它不再适用于小牛队。
在最新版本的 OS X 中,正确的做法是什么?
您将如何在 systemd 服务单元上设置 ulimit?
这个stackoverflow 问题解释了 systemd 忽略了系统 ulimits
设置以下 ulimit 的语法是什么样的?
ulimit -c
ulimit -v
ulimit -m
[Unit]
Description=Apache Solr
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
SOLR_INSTALL_DIR=/opt/solr
SOLR_ENV=/etc/default/solr.in.sh
RUNAS=solr
SOLR_PID_DIR="/var/solr"
SOLR_HOME="/opt/solr/server/solr"
LOG4J_PROPS="/var/solr/log4j.properties"
SOLR_LOGS_DIR="/opt/solr/server/logs"
SOLR_PORT="8389"
PIDFile=/var/solr/solr-8389.pid
ExecStart=/opt/solr/bin/solr start
ExecStatus=/opt/solr/bin/solr status
ExecStop=/opt/solr/bin/solr stop
Restart=on-failure
User=solr
SuccessExitStatus=143 0
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud) 最近我一直在挖掘有关 GNU/Linux 进程的信息,我遇到了臭名昭著的 fork 炸弹:
:(){ : | :& }; :
Run Code Online (Sandbox Code Playgroud)
理论上,它应该无限复制自己,直到系统耗尽资源......
但是,我已经尝试在CLI Debian和GUI Mint发行版上进行测试,它似乎对系统影响不大。是的,创建了大量进程,一段时间后我在控制台消息中阅读了如下内容:
bash: fork: 资源暂时不可用
bash: fork: 重试: 没有子进程
但是一段时间后,所有进程都会被杀死,一切都恢复正常。我读过ulimit为每个用户设置了最大进程数,但我似乎无法将其提高到很远。
什么是针对叉形炸弹的系统保护?为什么在一切都冻结或至少滞后很多之前它不会自我复制?有没有办法用叉子炸弹真正使系统崩溃?
我正在尝试安装389-ds,它给了我这个警告:
WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.
Run Code Online (Sandbox Code Playgroud)
我了解文件描述符,但我不了解软限制和硬限制。
当我跑cat /proc/sys/fs/file-max,我回来590432。这应该意味着我最多可以打开 590432 个文件(即最多有 590432 个文件描述符。
但是当我运行时ulimit,它给了我不同的结果:
$ ulimit
unlimited
$ ulimit -Hn # Hard limit
4096
$ ulimit -Sn # Soft limit
1024
Run Code Online (Sandbox Code Playgroud)
但是硬/软限制来自ulimit什么,它们与存储在的数字有什么关系/proc/sys/fs/file-max?
我可以使用 ulimit 但我认为这只会影响我的 shell 会话。我希望增加所有进程的限制。这是在红帽上。
有什么方法可以检查给定用户的 ulimit 使用情况吗?我知道您可以在启动时更改单个进程的 ulimit,或者在运行时更改单个 shell,但我希望能够“监控”用户接近其限制的程度。我计划编写一个bash脚本,将当前的使用百分比报告给 statsd。具体来说,我想跟踪:
ulimit -n )ulimit -u )ulimit -i )我想要的是使用百分比(0-100)。
我正在寻找一种方法来将进程磁盘 io 限制为设定的速度限制。理想情况下,该程序的工作方式类似于:
$ limitio --pid 32423 --write-limit 1M
Run Code Online (Sandbox Code Playgroud)
将进程 32423 限制为每秒 1 兆字节的硬盘写入速度。