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

Error while running a shell script : "pipe call failed"

本文关键字:pipe call failed 出错 shell 脚本 运行      更新时间:2023-10-16

我正在在infinte循环中执行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应用程序中"系统"命令的使用。如果使用"系统"执行此脚本,例如1000次,我将获得此错误。有人对此有任何想法吗?预先感谢

我看不到您的脚本任何明显的问题;错误消息确实"听起来像" a 系统资源问题(系统之间的这些值可能会有很大差异。)一些建议:

  • 当涉及特殊字符时,请考虑使用" fgrep",并且您需要否定可能的shell变量弹跳(不要以为这是这里的因素,但以防万一...)

  • 使用 ulimit -a

  • 检查您正在运行的用户/进程的"限制"
  • 您可能正在"消耗"更开放的文件(猜测),或者可能是'系统'有问题(而不是'用户流程');"真正的"问题可能是同时运行的其他一些过程正在消耗资源。

  • 如果您的系统/用户'限制都可以,并且由于您声明这是"无限循环",那么我会猜想您要产生多个进程而不是仅运行一个过程。一旦达到 pipe 文件相关的资源的"硬限制",脚本失败了,您将获得"系统错误"。

    $ ulimit -a |awk'{printf"%3D |%s n",nr,$ 0}'

1 |核心文件大小(块,-c)0
2 |数据seg大小(KBYTES,-D)无限
3 |调度优先级(-e)0
4 |文件大小(块,-f)无限
5 |等待信号(-i)46232
6 |最大锁定内存(kbytes,-l)64
7 |最大内存大小(KBYTES,-M)无限
8 |打开文件(-n)1024
9 |管道尺寸(512字节,-p)8
10 |POSIX消息队列(字节,-Q)819200
11 |实时优先级(-r)0
12 |堆栈尺寸(Kbytes,-s)10240
13 |CPU时间(秒,-t)无限
14 |最大用户进程(-U)1024
15 |虚拟内存(kbytes,-v)无限
16 |文件锁(-x)无限

" alvits"完全指出了使用系统命令的问题。通常,我们尝试实现等效的" C"代码,而不是使用系统命令以避免内存峰值。

看来您正在将while循环使用到您的C 代码中并调用此脚本。只需尝试如果可以在循环时运行脚本(仅导致一个系统调用),请将O/P重定向到文件,然后将文件连续读取为所需的结果。

错误消息"管道调用失败"意味着不再有免费的内存可以分配。如Dale所建议的,使用 ulimit -a 检查系统的限制,并验证以 System 命令的方式进行验证:依次或并行。

管道的尺寸为64kb启动形式的内核2.6.11。此外,System()命令通过调用/bin/sh -c命令来执行命令,并在命令完成后返回。调用 System 命令的效率不是很有效,因此我的建议是添加,而 cycle inceard your脚本以避免弱势性能(您可以提供迭代的数量作为第二个论点)。

最后,最好将Shebang(#!/bin/sh )添加为脚本的第一行,如果打算以可执行操作运行。这不是严格必要的,因为如果缺少Shebang,则使用默认外壳(例如/bin/sh )。

#!/bin/sh
HOME_NETWORK_INTERFACE=eth0
echo "Generating list of MoCA device MACs..."
if [ $# -lt 1 ]; then
        echo "Error! Insufficient arguments. Format is $0 <output file path>"
        exit 1
fi
X=0
while [ $X -lt $2 ]
do
    arp -n -i $HOME_NETWORK_INTERFACE | grep "?" | awk '{print $4}' > $1
    X=`expr $X + 1`
done
echo "Done"

最后我找到了这个问题。我在应用程序中使用插座通信。因此,某些插座无法正确关闭。