如何在终端窗口中限制命令?

如何在终端窗口中限制命令?

我需要convert同时运行大量图像。该命令耗费了相当长的时间,但这并不困扰我。

问题是,该命令运行时(大约 15 分钟)导致我的计算机无法使用。

那么,是否可以直接从命令行限制命令的资源(处理器和内存)来限制命令?这只有在我添加一些内容时才有效到同一行按下之前,Enter因为一旦我启动该过程,计算机就会变得非常慢,以至于不可能例如切换到“系统监视器”并降低优先级。

编辑:top 和 iotop 结果

我设法在执行其中一个转换操作时运行了topsudo iotop >iotop.txt。(生成的 iotop.txt 文件难以读取)

排名前列的结果:

   PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令           
14275 用户名 20 0 4043m 3.0g 1448 D 7.0 80.4 0:16.45 转换

iotop的结果:

[?1049h[1;24r(B[m[4l[?7h[?1h=[39;49m[?25l[39;49m(B[m[H[2J磁盘总读取速度:1269.04 K/s | 磁盘总写入速度:[59G0.00 B/s
(B[0;7m TID PRIO 用户磁盘读取磁盘写入 SWAPIN(B[0;1;7m IO>(B[0;7m 命令 [3;2H(B[m2516 be/4 用户名 350.08 K/s 0.00 B/s 0.00 % 0.00 % zeitgeist-datahub
 7394 be/4 用户名 568.88 K/s 0.00 B/s 77.41 % 0.00 % --rendere~.530483991[5;1H14275 空闲用户名 350.08 K/s 0.00 B/s 37.49 % 0.00 % 转换 S~f test.pdf[6;2H2048 be/4 root[6;24H0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/3:2]
[5G1 be/4 root[7;24H0.00 B/s 0.00 B/s 0.00 % 0.00 % 初始化

此外,即使该过程结束后,计算机也不会恢复到之前的性能。我找到了一种解决方法,即sudo swapoff -a运行sudo swapon -a

答案1

man nice,并且如果您需要 I/O 限制man ionice

我们来看一些简单的例子。

限制 CPU 使用率:

you@box:/$ nice -n 10 /usr/bin/convert blah.gif blah.jpg

但是,从您的描述来看,CPU 使用率几乎肯定不是您真正的问题。更可能的是,您遇到了严重的 I/O 争用。

限制磁盘使用量:

you@box:/$ ionice -c2 -n7 /usr/bin/convert blah.gif blah.jpg

-c2是“尽力而为”,并且-n7是最低的“尽力而为”优先级。因此,这将限制该作业的 I/O 优先级低于系统中的大多数其他任务。

you@box:/$ ionice -c3 /usr/bin/convert blah.gif blah.jpg

-c3(无需优先级)表示“仅空闲”。设置为-c3仅占用空闲磁盘调度时间的作业几乎不会对系统产生任何影响 - 但可能会相当您的作业的执行时间会更长,具体取决于系统其余部分的繁忙程度。

答案2

哦,天哪,我刚刚看到了这个...引用 OP 的话:

此外,即使该过程结束后,计算机也不会恢复到之前的性能。我找到了一种解决方法,即sudo swapoff -a运行sudo swapon -a

好的,这意味着您耗尽了系统上的可用 RAM,这意味着您只是试图convert同时运行太多进程。我们需要查看您在 spawning 中的实际语法convert才能提供建议,但基本上,您需要确保不要尝试打开比 RAM 能够轻松处理的更多的同时进程。

既然你说这是由 引起的convert *.tif blah.pdf,那么发生的事情是每个 TIF 的内容及其转换为 PDF 的内容都被一次性塞入 RAM。你需要做的是将工作分开,这样就没有必要这样做了。一种可能性是,改为执行类似 的操作find . -iname '*.tif' | xargs -I% convert % %.pdf,然后使用pdftk或类似的东西将所有单独的 pdf 粘合在一起。如果你真的如果你想变得花哨,并且你有一个多核 CPU,这也让你有机会编写一个小脚本来批量运行转换n, 在哪里n是您的核心数量,并且可以更快地完成整个任务。:)

pdftk 使用方法:http://ubuntuhowtos.com/howtos/merge_pdf_files (基本上可以归结为sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf

答案3

这是一篇关于使用程序来cpulimit限制任何进程的 CPU 使用率的非常好的文章:

http://maketecheasier.com/limit-cpu-usage-of-any-process-in-linux/2010/09/22

问题就像您说的,convert在进程启动后找到其 PID。

启动后,convert如果您仍然可以在终端中输入命令,则可以运行ps aux | grep convert以找到它的 PID,然后sudo cpulimit -p PID -l CPU%开始节流。

或者,如果启动时convert终端被锁定,本文将向您展示如何作为后台守护进程运行cpulimit,该守护进程将自动监视和限制超过一定 CPU 使用率的任何进程。祝您好运!

相关内容