脚本在 UNIX 中无法正常运行

脚本在 UNIX 中无法正常运行

我有一个脚本1,其中有大约 60 行与此类似

mv /log/ports-01/Homepage.log.$a /log/Backup/ports-01/

另外我还有另一个脚本2,它有一组这样的命令,用于上述脚本1中的所有移动命令

tar -cvf /log/Backup/ports-01/Homepage_$a.tar /log/Backup/ports-01/Homepage.log.$a
gzip /log/Backup/ports-01/Homepage_$a.tar
rm -f /log/Backup/ports-01/Homepage.log.$a

脚本2在脚本1运行2小时后运行。目录结构似乎没有问题。

但问题是并非所有日志都已移动并打包。此外,许多创建的 tar 文件都是空的,但日志文件已被删除。

另外我想问一下一个脚本里有这么多行是否有问题。

答案1

据我推断,问题可能出在变量“a”上。尝试

mv /log/ports-01/Homepage.log."$a" /log/Backup/ports-01/

也就是说,尝试引用变量引用(确保对变量的所有出现都执行此操作。另外,作为提示,您可以使用ztar 实用程序的选项直接创建 tarball,如下所示:tar czvf /path/to/ball.tar.gz /path/to/dir

答案2

好吧,如果手动执行时运行良好,那么环境变量可能存在问题,请检查您的脚本是否依赖于 CRON 环境中没有的某些环境变量。

另外,如果您执行两个脚本,并且第二个脚本依赖于第一个脚本,您是否会一个接一个地执行它们,例如:

0 */2 * * *  /home/username/first_script; /home/username/second_script

这很简单,但只是为了检查一下。

如果您无法通过这种方式找到答案,您可以使用“logger”命令来存储脚本所有步骤的日志,并尝试通过这种方式捕捉您的错误。

答案3

首先,脚本长度超过 60 行没有问题 —— 我经常处理包含数百行的 shell 脚本,shell 并不关心。

如果没有更多信息(向我们展示您的 crontab 条目/条目,以及正在运行的整个脚本 - 这个“ $a”是如何填充的?它包含空格吗?等等),很难给您一个好的、明确的答案,说明为什么它不起作用,但我可以给您一些思考的材料:

我对您执行脚本的方式有疑问:使用计时来分离相关操作是灾难的根源。根据这些文件的大小、磁盘的速度、是否跨分区等,您的第一个脚本可能在第二个脚本运行时尚未完成。这有两个主要含义:

  1. Script 1Script 2在制作 tarball时可能仍在移动文件。
  2. Script 2只是tar在执行命令时看到的内容tar
    • Script 2也是rm在收到rm命令时看到的内容——这可能意味着它正在删除未添加到 tarball 中的内容
    • 如果Script 1仍在运行,则完成后您将复制“杂散”文件rm- 这些文件将保留在那里。

@XoR 建议在 cron 中链接脚本是一种保护自己的方法。将两个脚本合并为一个更大的脚本也是一种方法。
使用锁定文件(Linux 具有锁文件(1)命令;我相信大多数 BSD 都有锁f(1)) 是另一种选择,并且比在 cron 中链接脚本更为强大。

相关内容