c++ - 运行 shell 脚本时出错 : "pipe call failed"

标签 c++ c linux shell sh

我正在无限循环中执行 shell 脚本。脚本旨在获取连接的设备。但是当它运行一段时间后,会在显示错误信息pipe call failed后停止执行。

这是我收到此错误的行

arp -n -i eth1 | grep "?" | awk '{print $4}' > out.txt

我在将此输出重定向到文件时做错了什么吗?有没有办法在 shell 脚本中处理文件描述符?

编辑:这是我的脚本

HOME_NETWORK_INTERFACE=eth1
echo "Generating list of MoCA device MACs..."
if [ $# -lt 1 ]; then
        echo "Error! Insufficient arguments. Format is $0 <output file path>"
        exit 1
fi
arp -n -i $HOME_NETWORK_INTERFACE | grep "?" | awk '{print $4}' > $1
echo "Done"

编辑:

我发现这个问题是由于在 cpp 应用程序中使用了“system”命令。如果使用“系统”执行此脚本,比如 1000 次,我将收到此错误。有人对此有任何想法吗?提前致谢

最佳答案

我没有发现您的脚本有任何明显的问题;错误消息确实“听起来像是”系统资源问题(这些值可能因系统而异。)一些建议:

  • 考虑在涉及特殊字符时使用“fgrep”并且您需要否定可能的 shell 变量修改(不要认为这是这里的一个因素,但以防万一......)

  • 使用 ulimit -a 检查您正在运行的用户/进程的“限制”

  • 您可能“消耗”了比允许的更多的打开文件(猜测),或者可能是“系统”出现了问题(而不是“用户进程”); “真正的”问题可能是同时运行的其他一些进程正在消耗资源。

  • 如果您的系统/用户“限制”没有问题,并且既然您声明这是一个“无限循环”,那么我猜您正在生成多个进程,而不是只运行一个进程。一旦达到管道文件相关 资源的“硬限制”,脚本就会失败,您会收到“系统错误”。

    $ ulimit -a | awk '{printf "%3d | %s\n", NR, $0}'

1 | core file size (blocks, -c) 0
2 | data seg size (kbytes, -d) unlimited
3 | scheduling priority (-e) 0
4 | file size (blocks, -f) unlimited
5 | pending signals (-i) 46232
6 | max locked memory (kbytes, -l) 64
7 | max memory size (kbytes, -m) unlimited
8 | open files (-n) 1024
9 | pipe size (512 bytes, -p) 8
10 | POSIX message queues (bytes, -q) 819200
11 | real-time priority (-r) 0
12 | stack size (kbytes, -s) 10240
13 | cpu time (seconds, -t) unlimited
14 | max user processes (-u) 1024
15 | virtual memory (kbytes, -v) unlimited
16 | file locks (-x) unlimited

关于c++ - 运行 shell 脚本时出错 : "pipe call failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22352130/

相关文章:

c++ - MFC:到底什么是 CSplitterWnd 插入符?

c - 如何消除所有也出现在ch2中的字母ch1(c语言)

c - 为什么是 1.2 * 30 = 35?

linux - 如何运行在 Cool 编译器中生成的中间文件,如 x86 汇编文件

c - 如何从进程内存镜像创建 ELF 可执行文件

c++ - Windows Linux C++编译问题: "no matching function for call"

c++ - 如何通过 C++ 连续写入文本文件并同时通过其他程序(不是 C++)连续读取相同的文本文件?

c++ - 计算字符串中元音的函数

c - fopen 文件名错误

linux - 自动选择静态库中的.o文件(.a文件)