我有一个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
我怎样才能改善这个?
答案 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节省的开销可以节省运行时间。