从 cron 或 at 运行时 Shell 脚本被截断

从 cron 或 at 运行时 Shell 脚本被截断

我发现我的 Linux NAS(DNS-323)上出现了一些非常奇怪的行为。我使用一个简单的 shell 脚本将 NAS 上的文件备份到另一个盒子。在最近添加了一些内容后,脚本在从cron或运行时开始失败at。当我直接运行脚本时,它没有任何问题。

之后很多经过调试,我终于意识到在某个点之后的所有内容都没有执行。就像脚本被截断了一样。我可以通过缩短脚本(主​​要是删除注释)来解决这个问题,现在它似乎可以正常工作了。不过,我仍然很好奇为什么会发生这种情况。

还有人见过类似的事情吗?这可能是什么原因造成的?

答案1

这里最大的区别是我们似乎正在研究某种嵌入式系统。

如果我没看错的话,应该是脚本被截断了,而不是输出(然后可以邮寄)。我会分别处理。

如果它实际上是脚本,但直接运行时有效,那么我建议如下:

  1. 剧本特别大吗?
  2. 脚本是否具有任何 Bash 特定的功能(“bashisms”)...请注意,/bin/sh 可能 - 而且通常是 - 不同的。您可能希望在 crontab 中设置 SHELL=/bin/bash(如果可用)
  3. 您是否尝试在 crontab 中编写脚本,或者是否调用脚本文件。
  4. 如果你重定向,行为会改变吗两个都stdout 和 stderr 是否传输到具有足够可用空间的文件系统上的文件?
  5. 在这种情况下,我发现创建一个临时的 crontab 条目很有用,它可以调用“env”命令,并将其输出重定向到文件或电子邮件。这有时会显示环境中的意外差异(例如区域设置,它们通常不同)。
  6. 您可以在脚本文件中放置一个“set -x”。这将导致它在脚本执行时输出调试信息。您可以使用“set +x”将其关闭。这对于确定脚本将在何处结束执行很有用。
  7. 这里使用什么样的软件:
    • SMTP:“sendmail --version”或“sendmail -v”的输出是什么

如果事实上它是输出,那么我应该说行为将在很大程度上取决于所使用的 MTA。在嵌入式环境中,它可能会超过某个缓冲区大小(也许这将由文件系统上的可用空间决定)。

另外,您是否检查过更新的固件:http://support.dlink.com/ProductInfo.aspx?m=DNS-323最新版本似乎是 2012 年 5 月的 1.10 版本

相关内容