2

我正在运行一个定制的解决方案来管理播客录制。一切都是通过 bash 脚本自动完成的,有一次,我将一个节目上传到 GCS,为播客的 RSS 生成 XML,然后上传 RSS。这就是我在 bash 脚本中运行的内容:

cd /path/to/tmp/files/
/path/to/gsutil cp -c -L /path/to/logs/gcloud_mp3.log *.mp3 gs://path/to/show/
wait
/path/to/gsutil -m acl set -R -a public-read gs://path/to/show/show.mp3
wait 

/path/to/php /path/to/rss_building_script.php

/path/to/gsutil cp -c *.xml gs://path/to/show/
wait
/path/to/gsutil -m acl set -R -a public-read gs://gs://path/to/show/rss.xml
wait

知道我的文件确实位于 /path/to/tmp/files/,我可以看到它们。但有时,文件不会上传,运行脚本也不会抛出任何错误。例如,昨晚,我录制了“show #1”。它录制,创建 mp3 文件,将 mp3 上传到 GCS,创建 XML,不上传 XML。我见过一些两个文件都不会上传的情况。

问题是,没有显示错误。在昨晚的第一场演出中,我得到的是

  • 将 mp3 文件复制到 GCS;
  • 将 ACL 设置为 mp3 文件;
  • 将 ACL 设置为 xml 文件;
  • 错误,XML 文件不存在。

在应该上传 XML 文件的地方,什么也没有发生。没有错误。根本不值一提。我怎么能调试这个?

4

2 回答 2

2

当程序像这样默默地失败时,我通常会转向strace. 像这样的命令,例如:

strace gsutil cp -c -L /path/to/logs/gcloud_mp3.log *.mp3 gs://path/to/show/ 2>&1 | tee /tmp/strace.gsutil

将产生大量产出。接近尾声时,当程序因错误而崩溃时,可能会有一些系统调用给你提示什么是错误的。尤其要查找Eerrno 常量,例如ENOENT (No such file or directory).

为了进一步介绍,这篇文章有一些很好的例子和模式

当然,这个特定的错误可能是上游的时间问题,对您来说根本没有任何意义。strace 输出可能会提供一些诊断信息(超时?),也可能不会。在这种情况下,我会检查“奇怪”的情况,例如 UTF 问题、文件大小限制、并行问题、连接性等。

于 2014-07-17T13:26:23.000 回答
1

每次运行脚本时都会出现这个问题吗?您可能会遇到列表操作的最终一致性问题(当您运行递归操作或涉及通配符的操作时会隐式执行这些操作)。

为了避免该问题,您可以做的一件事是在执行上传时设置 ACL(这是可能的,因为您使用的是预制 ACL 而不是自定义 ACL)。例如:

/path/to/gsutil cp -a public-read -c -L /path/to/logs/gcloud_mp3.log *.mp3 gs://path/to/show/

这样您就不需要运行 gsutil acl set 命令,因此列出最终的一致性并不重要。

于 2014-07-27T12:52:43.457 回答