让Cron作业在后台执行脚本并运行15个小时

时间:2017-04-07 17:17:31

标签: php bash cron

我有一个PHP脚本需要大约15个小时才能运行,我必须每周运行一次。该脚本将大量(70gb)CSV文件的内容下载并提取到我们的数据库中。

我需要脚本在每个星期日下午6点开始运行并继续运行直到它完成处理文件。

我的计划是创建一个包含以下内容的bash文件 cron.sh

nohup php /var/www/html/cron.php > /var/www/html/outputs/`date "+%Y-%m-%d %H:%M:%S"`.log

而cron是:

0 18 * * 0 /var/www/html/cron.sh

我怎样才能改善这个?

2 个答案:

答案 0 :(得分:1)

请记住重定向stderr:

nohup php /var/www/html/cron.php > dir/stdout.log 2> dir/stderr.log

或者如果您希望将它们全部合并到同一个文件中:

nohup php /var/www/html/cron.php > dir/stdout.log 2>&1

2>&1表示将stderr重定向到stdout正在使用的文件。

其余的都很好,把命令放在一个shell脚本中,如果行太长就会使它更具可读性。此外,如果您以后想要使任务执行更多操作,则更新脚本文件会更容易。

我可能会将cron.sh文件重命名为更有意义的内容。

答案 1 :(得分:1)

既然你的OP问了"我怎样才能改善这个" - 你没有提到你是否使用PHP。

如果CSV很大..我会创建一个bash文件,它与PHP文件的作用相同(因为你已经调用了cron.sh)。您必须将PHP配置更改为低于理想的设置才能有效地运行它。恕我直言Bash是要走的路。这样nohup可以完全绕过。

意思是我会:

1)为MySQL创建一个登录路径,以便从.sh文件安全地连接到您的数据库。您可以使用以下命令实现此目的:

sudo mysql_config_editor set --login-path=client --host=yourHost --user=MySQL_user --password

系统将提示您输入MySQL密码。

2)完成后,您可以在bash文件中访问MySQL,并在同一个文件中创建所有日志:

#!/bin/bash

cd /place/where/you/want/the/csv/

wget http://your_file_location.com/csv/location/file.csv
# Or whatever you're doing to "download" it -- Just an example .. 

mysql --login-path=local infile=1 3parsfdb -e "LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE your_table FIELDS TERMINATED BY ','"

echo "Whatever you've collected" >> /var/www/html/outputs/`date "+%Y-%m-%d %H:%M:%S"`.log

当然,这仅仅是一个例子......但是你得到了一般的想法。然后将所述bash文件存储在安全的位置。

3)将新创建的bash文件放入crontab。您可以使用用户crontab,或者如果用户无法访问您放入的bash文件或目录,则可以使用root crontab - IE:

0 18 * * 0 /path/to/your/bash/file/BackupCSVToDB.sh

不必使用PHP节省的开销可以节省运行时间。