gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:11:14 25 4
gpt4 key购买 nike

有时我需要这样运行命令:

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脚本中,这样你就可以直接和系统地处理这些事情。

关于bash - 如何跟踪 bash 脚本 - 退出状态及其失败的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com