4

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

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

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

请问,我怎样才能跟踪正在发生的事情?为什么以及何时我的命令失败了?我知道管道正在工作,因为有时它只是成功完成。

非常感谢!

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

有没有办法找出我的进程实际上被杀死了?谢谢。

4

3 回答 3

4

第一步,将该脚本封装在一个文件中,而不是直接在终端上运行它(在我们使用它时会失去 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脚本中,这样你就可以直接系统地处理这些事情了。

于 2013-10-19T18:10:20.280 回答
2

使用screen,pvtee来捕获所有错误,有一个进度条,并允许从最后一个成功的命令重新启动,而不是在出现错误时从头开始。

您可以使用screen多路复用器)而不是后台处理您的过程。这样,您可以随时查看其状态,而不会错过错误消息。只需键入screen,在没有 , 的情况下运行您的命令&,然后点击CTRL-a,d. 然后,您可以注销。要稍后查看输出,登录(甚至远程)并输入screen -r.

此外,如果您将首字母替换为catpv管道查看器),您将看到一个进度条,告诉您已经处理了多少:

pv -cN file.txt

你会看到类似的东西

611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

每当您重新附加该screen进程时。

或者/互补地,您可以tee在命令之后插入以将其输出复制到文件中,然后再将其传播到下一个文件。

uniq -c | tee afteruniq.tmpfile | sort -gr

该文件afteruniq.tmpfile将包含uniq -c. 所以你知道什么有效,什么失败了。tee您还可以在'd 文件的最后一个成功步骤之后恢复链。

于 2013-10-19T18:16:53.723 回答
0

您需要将两者都重定向stderrstdout您的输出文件。

让你的命令像这样:

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

注意2>&1重定向stderr到任何地方stdout

于 2013-10-19T17:57:48.060 回答