相关疑难解决方法(0)

限制单个 Linux 进程的内存使用

我正在pdftoppm将用户提供的 PDF 转换为 300DPI 图像。这很好用,除非用户提供页面非常大的 PDF。 pdftoppm将分配足够的内存来在内存中保存该大小的 300DPI 图像,对于 100 英寸的方形页面,它是 100*300 * 100*300 * 4 字节/像素 = 3.5GB。恶意用户可以给我一个愚蠢的大 PDF 并导致各种问题。

所以我想做的是对我即将运行的子进程的内存使用设置某种硬限制——如果它试图分配超过 500MB 的内存,就让进程死掉。那可能吗?

我不认为 ulimit 可以用于此,但是否有一个等价的进程?

linux memory ulimit

207
推荐指数
7
解决办法
30万
查看次数

发生错误时如何在 Bash 中找到行号?

如何在 Bash 中找到发生错误的行号?

例子

我创建了以下带有行号的简单脚本来解释我们需要什么。该脚本将从中复制文件

cp $file1 $file2
cp $file3 $file4
Run Code Online (Sandbox Code Playgroud)

当其中一个cp命令失败时,该函数将以exit 1 退出。我们希望向函数添加还打印带有行号(例如,8 或 12)的错误的功能。

这可能吗?

示例脚本

1 #!/bin/bash
2
3
4 function in_case_fail {
5 [[ $1 -ne 0 ]] && echo "fail on $2" && exit 1
6 }
7
8 cp $file1 $file2
9 in_case_fail $? "cp $file1 $file2"
10
11
12 cp $file3 $file4
13 in_case_fail $? "cp $file3 $file4"
14
Run Code Online (Sandbox Code Playgroud)

linux scripting bash logs shell-script

35
推荐指数
3
解决办法
2万
查看次数

使用 expr, $(()), (())

在 shell 脚本中,我们可以expr $a*$b$(($a+$b)).

但为什么不只是 with (($a+$b)),因为在任何资源中,它(())都是为整数计算而编写的。

所以我们$(())在有变量而不是整数值时使用,是吗?$(())当变量可以接收浮点值时,我们应该使用什么来代替?

bash shell-script expr

11
推荐指数
1
解决办法
3万
查看次数

为什么当计算结果等于0时'let'以代码1退出?

我遇到了这个问题,其作者处理了由以下原因引起的问题: let x=1-1exit with code 1。

根据bash 手册

如果最后一个表达式的计算结果为 0,则 let 返回 1;否则返回 0。(第 56-57 页)

我不太熟悉 bash 的细微差别,所以我的问题是“这种行为的原因是什么?”。可能是因为 0 解释为“假”?对于像我这样的 bash 初学者来说,这有点奇怪,算术表达式的结果 0 会导致错误退出代码......

bash math exit-status

9
推荐指数
1
解决办法
877
查看次数

标签 统计

bash ×3

linux ×2

shell-script ×2

exit-status ×1

expr ×1

logs ×1

math ×1

memory ×1

scripting ×1

ulimit ×1