2017-04-07 170 views
1

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

我需要脚本在每个星期日的下午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 

我怎么能提高呢?

+0

改进什么?将csv内容添加到db的时间? –

+0

对不起,不太清楚。 cronjob执行PHP脚本的过程的一部分。例如 例如。我应该直接从cron作业执行php脚本等。 – MagnusD

+0

不要在评论中添加细节。相反,[编辑]你的问题,并把它放在它所属的地方。你的帖子应该包含一个*明确的,具体的问题描述*和一个与该问题相关的特定问题*。你没有。 –

回答

1

记住重定向标准错误,以及:

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文件重命名为更有意义的文件。

+0

另外,通过分隔要在脚本文件中执行的命令,没有cron特权的用户仍然可以更新脚本(如果他/她具有正确的文件权限)。 – kontiki

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可以节省几个小时的运行时间。