可能重复:
从 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 中。