加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何跟踪bash脚本 – 退出状态及其失败原因

发布时间:2020-12-15 21:33:44 所属栏目:安全 来源:网络整理
导读:有时候我需要像这样运行命令: cat file.txt | awk ' NR%4 == 2 { print $1 }' | sort | uniq -c | sort -gr output.txt 大文件(2-32 GB大小).我在晚上启动命令,当我早上来的时候,output.txt有时是空的,进程不再运行了. 请问,我该如何追踪正在发生的事情?为
有时候我需要像这样运行命令:

cat file.txt | awk ' NR%4 == 2 { print $1 }' | sort | uniq -c | sort -gr >>output.txt &

大文件(2-32 GB大小).我在晚上启动命令,当我早上来的时候,output.txt有时是空的,进程不再运行了.

请问,我该如何追踪正在发生的事情?为什么以及何时我的命令失败?我知道管道正在运行,因为有时它只是成功完成.

非常感谢!

更新:
我现在认为我的进程被杀死了,因为我运行此计算时的服务器建议仅用于交互式使用.如果这是真的,那么我只能从日志文件中看到它是不成功的 – 还没有完成.

有没有办法发现我的过程实际上被杀了?谢谢.

解决方法

第一步,将该脚本封装在一个文件中,而不是直接在终端上运行(并在我们使用它时失去UUOC奖励).

#!/bin/bash

{
awk 'NR%4 == 2 { print $1 }' file.txt | sort | uniq -c | sort -gr >>output.txt
} 2>error.log

这将捕获文件error.log中的所有错误消息.然后,您可以添加诊断信息.

#!/bin/bash

{
date >&2
set -x
awk 'NR%4 == 2 { print $1 }' file.txt | sort | uniq -c | sort -gr >>output.txt
date >&2
} 2>error.log

现在你已经获得了时间信息 – 它何时开始以及何时完成.由于你是bash,你可以安排在管道中捕获每个进程的退出状态,这样你就可以准确地知道哪些命令退出了哪个状态.您可能会或可能不会获得有关哪个进程被终止的消息(如果进程被外部信号杀死),但如果进程自行死亡,它应该在标准错误上打印一条消息(这就是它的用途,以及为什么将错误打印到标准错误而不是标准输出是至关重要的.

使用此脚本,您将标准输出发送到output.txt,标准错误发送到error.log;该脚本不使用标准输入(数据来自file.txt).因此,您可以使用nohup或仅使用&没有任何疑虑.

您可能更喜欢将名称file.txt命名为命令行参数;您可能希望使输出和日志文件可配置.您可能更喜欢日期输出的不同格式.所有这些都是可以调整的.但关键是将它放入shell脚本中,以便您可以直接和系统地处理这些事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读