脚本在UNIX中无法正常工作

我有一个脚本1有大约60行类似于此

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

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

 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 

Script2运行2小时后运行。 目录结构似乎没有问题。

但问题是,并非所有的日志都被移动和涂抹。 还有许多创build的tar文件是空的,但日志文件被删除。

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

从我可以推论出来的问题可能是variables'a'。 尝试

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

也就是说,试着引用variables引用(确保你在variables的所有出现处做这个事情)另外,作为一个提示,你可以使用tar工具的z选项来直接创buildtar包,如下所示: tar czvf /path/to/ball.tar.gz /path/to/dir

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

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

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

这是微不足道的,但只是为了检查。

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

首先,脚本超过60行是没有问题的 – 我经常处理其中有数百行脚本的shell脚本,shell并不在意。

没有更多的信息(告诉我们你的crontab入口/条目,整个脚本正在运行 – 这个“ $a ”是如何填充的?是否包含空格?等等),很难给出一个好的,明确的答案,不工作,但我可以给你一些想法:

我在执行脚本时遇到了一个问题:使用时间来分隔依赖的操作是一种灾难。 取决于这些文件的大小,磁盘的速度有多慢,是否跨越分区等等等等。当第二个脚本运行时,第一个脚本可能没有完成。 这有两个主要的含义:

  1. Script 1可能仍在移动文件,而Script 2正在制作tarball。
  2. Script 2只是执行tar命令时看到的内容。
    • Script 2到达rm命令时, Script 2也是它所看到的 – 这可能意味着它删除了没有添加到tarball中的东西
    • 如果Script 1仍然在运行,那么在rm完成之后,将会有“stream浪”的文件被拷贝过来 – 这些只会坐下来。

@ XoRbuild议在cron中链接脚本是保护自己的一种方法。 所以将两个脚本合并成一个更大的脚本。
使用locking文件(Linux有locking文件( 1)命令;我相信大多数的BSDs lockf(1) )是另一种select,并且比在cron中一起链接脚本更加稳健。