脚本的某些部分未在 cron 中执行

脚本的某些部分未在 cron 中执行

可能重复:
从 cron 执行 sh 脚本

我创建了一个脚本,试图通过 cron 运行,但遇到了问题。手动执行时,该脚本运行良好,但当我将其放入时/etc/cron.hourly,某些部分不起作用。我见过类似的问题,答案通常是指 cron 的有限环境和使用完整路径。这是一个类似的问题:从 cron 执行 sh 脚本

这是我正在尝试运行的脚本的精简版本。

#!/bin/sh
#Run download script to download product data
cd /home/dir/Scripts/Linux
sh script1.sh

#Run import script to import product data to MySQL
cd /home/dir/Mysql
sh script2.sh

#Download inventory stats spreadsheet and rename it
cd /home/dir
wget http://www.url.com/file1.txt
mv file1.txt sheet1.csv

#Remove existing export spreadsheet
rm /tmp/sheet2.csv

#Run MySQL queries in "here document" format
mysql database_name << EOF

--Drop old inventory stats table
truncate table table_name1;

--Load new inventory stats into table
Load data local infile '/home/dir/sheet1.csv' into table table_name1 fields terminated by ',' optionally enclosed by '"' lines terminated by '\r\n';

--MySQL queries to combine product data and inventory stats here

--Export combined data in spreadsheet format
group by p.value into outfile '/tmp/sheet2.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\r\n';
EOF

我知道部分内容正在运行,因为/tmp/sheet2.csv根据第 16 行,内容已被删除。但是,没有/tmp/sheet2.csv导出任何新内容,因为它应该在脚本末尾。

有什么办法可以解决这个问题吗?我不太熟练,所以不清楚如何解决 cron 有限环境的问题。

答案1

一件事:在 cron 环境中路径受到更多限制,因此对于使用的命令(尤其是命令)使用绝对路径是个好主意mysql

此外,如果没有用户名/密码,则可能mysql无法连接到您的数据库。同样,它不是在您的正常环境中运行的,在正常环境中,您可能存在环境变量或配置文件,允许您在不使用选项的情况下使用mysql

为了帮助您调试 cron 脚本,您可以尝试将命令输出重定向到临时文件中。

答案2

您已经写好了。对所有命令使用完整路径或相对路径。

如果你想执行其他脚本,请使用/bin/sh ./another.sh

在您的交互式 shell 中 - 是否PATH包含当前目录 ( .)?这基本上是一个安全风险,并且 cron 不会将其添加到其PATH-setting 中。

相关内容