我有一个脚本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/
也就是说,尝试引用变量引用(确保对变量的所有出现都执行此操作。另外,作为提示,您可以使用z
tar 实用程序的选项直接创建 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
”是如何填充的?它包含空格吗?等等),很难给您一个好的、明确的答案,说明为什么它不起作用,但我可以给您一些思考的材料:
我对您执行脚本的方式有疑问:使用计时来分离相关操作是灾难的根源。根据这些文件的大小、磁盘的速度、是否跨分区等,您的第一个脚本可能在第二个脚本运行时尚未完成。这有两个主要含义:
Script 1
Script 2
在制作 tarball时可能仍在移动文件。Script 2
只是tar
在执行命令时看到的内容tar
。Script 2
也是rm
在收到rm
命令时看到的内容——这可能意味着它正在删除未添加到 tarball 中的内容- 如果
Script 1
仍在运行,则完成后您将复制“杂散”文件rm
- 这些文件将保留在那里。
@XoR 建议在 cron 中链接脚本是一种保护自己的方法。将两个脚本合并为一个更大的脚本也是一种方法。
使用锁定文件(Linux 具有锁文件(1)命令;我相信大多数 BSD 都有锁f(1)) 是另一种选择,并且比在 cron 中链接脚本更为强大。