微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – sort:写入失败|破管

晚上好,

以下是我在脚本中使用的一段代码.从SSH sesssion启动工作正常,但是,当它通过cron运行时,它会在屏幕上显示损坏的管道错误.

我不能通过SSH重现它.

码:

IP=$(sort --random-sort /root/ips.csv | head -n 1); nc -zv -w 2 $IP 443 2>&1 | grep succeeded >> outfile

屏幕错误

sort: write Failed: standard output; broken pipe
sort: write error

任何提示/指针?

谢谢!

解决方法:

当头部在处理完第一条线后完成时,它会退出,关闭管道的另一端. sort可能仍在尝试编写更多内容,写入已关闭的管道或套接字会返回EPIPE错误.但它也会引发SIGPIPE信号,从而导致进程无效,除非忽略或处理信号.忽略信号后,sort会看到错误,抱怨和退出.但是如果信号没有被忽略,它就会死掉,而不会留下错误信息.

忽略信号会继承到子进程,因此我们可以从shell控制它:

$ trap - PIPE                           # set default action for signal
$sort bigfile | head -1 > /dev/null    # no error message
$trap "" PIPE                          # ignore the signal
$sort bigfile | head -1 > /dev/null 
sort: write Failed: standard output: broken pipe
sort: write error

我不知道为什么cron会忽略信号,除非它与systemd有关,其中apparently makes SIGPIPE ignored by default

That’s
not really useful for normal daemons though, and as we try to provide a
good, useful execution environment for daemons, we turn this off. Of
course, shells and suchlike should turn this on again.

在我的系统上,/ lib / system / system / cron.service显式撤消了cron的认值,设置了IgnoreSIGPIPE = false.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐