服务器

服务器

Nginx请求报错400如何解决?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 1384 次浏览 • 2023-07-19 12:33 • 来自相关话题

Nginx+PHP-FPM架构,结合PHP8.1搭建应用服务器时的一些总结和记录

PHPzkbhj 发表了文章 • 0 个评论 • 2191 次浏览 • 2022-12-08 14:07 • 来自相关话题

最近在做一个项目,使用了PHP8.1语言版本,语言框架使用的是Yii2的最新版本,然后再搭建服务器环境和部署应用的过程中遇到了一些问题,现总结如下,给同样场景可能会遇到一些类似问题的你提供一些解决方案,既然已经踩过一遍坑了,方便大家,也方便后续回顾总结。
 
一、编译安装PHP8.1:
因为编译过程中基本上遇到问题的概率并不大,我的编译过程还算顺利,因为服务器上保留了以前其他人运行的项目。PHP的版本是7.2.3,所以就编译安装了PHP8.1到一个指定的地方,然后独立安装的PHP-FPM。尽量不影响以前的项目运行。
我的编译配置信息(注意要一行,不能存在换行符):./configure --prefix=/usr/local/php8.1 --with-config-file-path=/usr/local/php8.1/etc --with-curl --with-freetype --enable-gd --with-jpeg --with-gettext --with-kerberos --with-libdir=lib64 --with-libxml --with-mysqli --with-openssl --with-pdo-mysql --with-pdo-sqlite --with-pear --enable-sockets --with-mhash --with-ldap-sasl --with-xsl --with-zlib -with-bz2 --with-iconv --enable-fpm --enable-pdo --enable-bcmath --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-soap --enable-sockets --enable-sysvsem --enable-xml --enable-sysvsem --enable-cli --enable-opcache --enable-intl --enable-calendar --enable-static --enable-mysqlnd最终我把编译好的php-fpm文件复制到了我的PHP8.1目录下,并完成了配置启动。这会儿还一切看似顺利。
 
编译过程中遇到了一个问题是:
configure: error: iconv does not support errno
 优先参考网上的解决方案安装缺失的iconv,如果不行,在运行configure之前先运行:
export LDFLAGS="$LDFLAGS -liconv"参考官网bug讨论 https://bugs.php.net/bug.php?id=80585,在此对歪果友人诚挚的感谢。

二、部署应用:
搭建好之后,顺利启动PHP-FPM服务器,监听端口9000,然后再Nginx配置文件中,将请求信息直接给到9000端口来处理,这里就有一些“东西”要注意了,否则就遇到了下面的问题:
 
问题1:部署应用之后,请求失败,页面返回“File not Found”,然后查看Nginx的报错日志,显示信息是:2022/12/08 13:15:51 [error] 31547#0: *29582 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 119.116.237.75, server: web.*.com, request: "GET /site/user-agreement HTTP/2.0", upstream: "fastcgi://127.0.0.1:9000", host: "web*.*com"网上说中问题, 比如php-fpm的 运行group和user不对啦,应用目录权限不足啦,但我发现根本原因是在Nginx转发时,少了一个重要的配置信息。
由于我的yii2项目启用了 URLManage功能,为了让链接看起来更漂亮一些,所以需要在Nginx配置文件中加入下面的这个配置:if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}

所以,完整的转发配置应该是:location / {
fastcgi_pass 127.0.0.1:9000;
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}所以这块,大家应该注意一下,更改完,重新启动Nginx服务之后,项目正常启动了!
 
问题二、页面图标显示异常:
由于使用了第三方图标工具,打开F12工具之后,发现是静态资源服务器访问字体文件时显示跨域:Access to Font at “xxx” from origin “xxx” has been by CORS plicy:
No ‘Access-Control-Allow-Origin’header is present on the requested resource.
Origin “xxx” is therefore not allowed access.这时候,只需要在静态资源服务器的Nginx配置文件中增加下面的配置项即可:location ~* .(eot|ttf|woff|swoff2|svg|otf)$ {
add_header Access-Control-Allow-Origin [url]http://www.zkbhj.com;[/url] //只允许单域名或者 ‘*' 。不推荐 ‘*' ,会导致安全问题
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
} 查看全部
最近在做一个项目,使用了PHP8.1语言版本,语言框架使用的是Yii2的最新版本,然后再搭建服务器环境和部署应用的过程中遇到了一些问题,现总结如下,给同样场景可能会遇到一些类似问题的你提供一些解决方案,既然已经踩过一遍坑了,方便大家,也方便后续回顾总结。
 
一、编译安装PHP8.1:
因为编译过程中基本上遇到问题的概率并不大,我的编译过程还算顺利,因为服务器上保留了以前其他人运行的项目。PHP的版本是7.2.3,所以就编译安装了PHP8.1到一个指定的地方,然后独立安装的PHP-FPM。尽量不影响以前的项目运行。
我的编译配置信息(注意要一行,不能存在换行符):
./configure --prefix=/usr/local/php8.1 --with-config-file-path=/usr/local/php8.1/etc --with-curl --with-freetype --enable-gd --with-jpeg --with-gettext --with-kerberos --with-libdir=lib64 --with-libxml --with-mysqli --with-openssl --with-pdo-mysql --with-pdo-sqlite --with-pear --enable-sockets --with-mhash --with-ldap-sasl --with-xsl --with-zlib -with-bz2 --with-iconv --enable-fpm --enable-pdo --enable-bcmath  --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-soap --enable-sockets --enable-sysvsem --enable-xml --enable-sysvsem --enable-cli --enable-opcache --enable-intl --enable-calendar --enable-static --enable-mysqlnd
最终我把编译好的php-fpm文件复制到了我的PHP8.1目录下,并完成了配置启动。这会儿还一切看似顺利。
 
编译过程中遇到了一个问题是:
configure: error: iconv does not support errno

 优先参考网上的解决方案安装缺失的iconv,如果不行,在运行configure之前先运行:
export LDFLAGS="$LDFLAGS -liconv"
参考官网bug讨论 https://bugs.php.net/bug.php?id=80585,在此对歪果友人诚挚的感谢。

二、部署应用:
搭建好之后,顺利启动PHP-FPM服务器,监听端口9000,然后再Nginx配置文件中,将请求信息直接给到9000端口来处理,这里就有一些“东西”要注意了,否则就遇到了下面的问题:
 
问题1:部署应用之后,请求失败,页面返回“File not Found”,然后查看Nginx的报错日志,显示信息是:
2022/12/08 13:15:51 [error] 31547#0: *29582 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 119.116.237.75, server: web.*.com, request: "GET /site/user-agreement HTTP/2.0", upstream: "fastcgi://127.0.0.1:9000", host: "web*.*com"
网上说中问题, 比如php-fpm的 运行group和user不对啦,应用目录权限不足啦,但我发现根本原因是在Nginx转发时,少了一个重要的配置信息。
由于我的yii2项目启用了 URLManage功能,为了让链接看起来更漂亮一些,所以需要在Nginx配置文件中加入下面的这个配置:
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}

所以,完整的转发配置应该是:
location / {
fastcgi_pass 127.0.0.1:9000;
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
所以这块,大家应该注意一下,更改完,重新启动Nginx服务之后,项目正常启动了!
 
问题二、页面图标显示异常:
由于使用了第三方图标工具,打开F12工具之后,发现是静态资源服务器访问字体文件时显示跨域:
Access to Font at “xxx” from origin “xxx” has been by CORS plicy:
No ‘Access-Control-Allow-Origin’header is present on the requested resource.
Origin “xxx” is therefore not allowed access.
这时候,只需要在静态资源服务器的Nginx配置文件中增加下面的配置项即可:
location ~* .(eot|ttf|woff|swoff2|svg|otf)$ {
add_header Access-Control-Allow-Origin [url]http://www.zkbhj.com;[/url] //只允许单域名或者 ‘*' 。不推荐 ‘*' ,会导致安全问题
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}

Nginx服务器端怎么解决font字体文件跨域?

回复

前端开发zkbhj 回复了问题 • 1 人关注 • 2 个回复 • 5850 次浏览 • 2022-12-08 13:52 • 来自相关话题

如何将curl接口中的返回内容输出到指定文件中?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 7853 次浏览 • 2020-01-02 11:14 • 来自相关话题

Linux如何定时删除某个目录下的所有文件,如日志文件?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4955 次浏览 • 2019-12-02 11:39 • 来自相关话题

Linux如何查找文件内指定内容并复制到新文件中?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5628 次浏览 • 2019-11-08 14:58 • 来自相关话题

如何查看Linux中当前被占用的端口号?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4291 次浏览 • 2019-10-27 10:03 • 来自相关话题

Linux如何创建目录链接?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4660 次浏览 • 2019-09-26 17:58 • 来自相关话题

Linux下的crontab命令详细解析

服务器zkbhj 发表了文章 • 0 个评论 • 2565 次浏览 • 2019-09-02 10:20 • 来自相关话题

linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。

一、crond简介

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

[root@localhost ~]# cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=””HOME=/

# run-parts

51 * * * * root run-parts /etc/cron.hourly

24 7 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

[root@localhost ~]#

前 四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行 命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

使用者权限文件:

文件:

/etc/cron.deny

说明:

该文件中所列用户不允许使用crontab命令

文件:

/etc/cron.allow

说明:

该文件中所列用户允许使用crontab命令

文件:

/var/spool/cron/

说明:

所有用户crontab文件存放的目录,以用户名命名

crontab文件的含义:

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command

其中:

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。





 
在以上各个字段中,还可以使用以下特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

二、crond服务

安装crontab:

yum install crontabs

服务操作说明:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

查看crontab服务状态:

service crond status

手动启动crontab服务:

service crond start

查看crontab服务是否已设置为开机启动,执行命令:

ntsysv

加入开机自动启动:

chkconfig –level 35 crond on

三、crontab命令详解

1.命令格式:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

2.命令功能:

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。

3.命令参数:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

4.常用方法:

1). 创建一个新的crontab文件

在 考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑 crontab文件。9 9 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$ HOME目录下的. profile文件,在其 中加入这样一行:

EDITOR=vi; export EDITOR

然后保存并退出。不妨创建一个名为<user> cron的文件,其中<user>是用户名,例如, davecron。在该文件中加入如下的内容。

# (put your own initials here)echo the date to the console every

# 15minutes between 6pm and 6am

0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console

保存并退出。确信前面5个域用空格分隔。

在 上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些 系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为 cron命令的参数:

$ crontab davecron

现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。

同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。

2). 列出crontab文件

为了列出crontab文件,可以用:

$ crontab -l

0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:

$ crontab -l > $HOME/mycron

这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

3). 编辑crontab文件

如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:

$ crontab -e

可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

$ crontab -l

# (crondave installed on Tue May 4 13:07:43 1999)

# DT:ech the date to the console every 30 minites

0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

4). 删除crontab文件

要删除crontab文件,可以用:

$ crontab -r

5). 恢复丢失的crontab文件

如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:

$ crontab <filename>

其中,<filename>是你在$ H O M E目录中副本的文件名。

我建议你在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。
 5.使用实例

实例1:每1分钟执行一次command

命令:

* * * * * command

 

实例2:每小时的第3和第15分钟执行

命令:

3,15 * * * * command

 

实例3:在上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * * command

 

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 */2 * * command

 

实例5:每个星期一的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * 1 command

 

实例6:每晚的21:30重启smb 

命令:

30 21 * * * /etc/init.d/smb restart

 

实例7:每月1、10、22日的4 : 45重启smb 

命令:

45 4 1,10,22 * * /etc/init.d/smb restart

 

实例8:每周六、周日的1 : 10重启smb

命令:

10 1 * * 6,0 /etc/init.d/smb restart

 

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb 

命令:

0,30 18-23 * * * /etc/init.d/smb restart

 

实例10:每星期六的晚上11 : 00 pm重启smb 

命令:

0 23 * * 6 /etc/init.d/smb restart

 

实例11:每一小时重启smb 

命令:

* */1 * * * /etc/init.d/smb restart

 

实例12:晚上11点到早上7点之间,每隔一小时重启smb 

命令:

* 23-7/1 * * * /etc/init.d/smb restart

 

实例13:每月的4号与每周一到周三的11点重启smb 

命令:

0 11 4 * mon-wed /etc/init.d/smb restart

 

实例14:一月一号的4点重启smb 

命令:

0 4 1 jan * /etc/init.d/smb restart

实例15:每小时执行/etc/cron.hourly目录内的脚本

命令:

01   *   *   *   *     root run-parts /etc/cron.hourly

说明:

run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

四、使用注意事项

注意环境变量问题

有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1)脚本中涉及文件路径时写全局路径;

2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

注意清理系统用户的邮件日志

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

系统级任务调度与用户级任务调度

系 统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

其他注意事项

新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。

千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。

在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。 查看全部
linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。

一、crond简介

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

[root@localhost ~]# cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=””HOME=/

# run-parts

51 * * * * root run-parts /etc/cron.hourly

24 7 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

[root@localhost ~]#

前 四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行 命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

使用者权限文件:

文件:

/etc/cron.deny

说明:

该文件中所列用户不允许使用crontab命令

文件:

/etc/cron.allow

说明:

该文件中所列用户允许使用crontab命令

文件:

/var/spool/cron/

说明:

所有用户crontab文件存放的目录,以用户名命名

crontab文件的含义:

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command

其中:

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

QQ截图20190902101714.jpg

 
在以上各个字段中,还可以使用以下特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

二、crond服务

安装crontab:

yum install crontabs

服务操作说明:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

查看crontab服务状态:

service crond status

手动启动crontab服务:

service crond start

查看crontab服务是否已设置为开机启动,执行命令:

ntsysv

加入开机自动启动:

chkconfig –level 35 crond on

三、crontab命令详解

1.命令格式:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

2.命令功能:

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。

3.命令参数:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

4.常用方法:

1). 创建一个新的crontab文件

在 考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑 crontab文件。9 9 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$ HOME目录下的. profile文件,在其 中加入这样一行:

EDITOR=vi; export EDITOR

然后保存并退出。不妨创建一个名为<user> cron的文件,其中<user>是用户名,例如, davecron。在该文件中加入如下的内容。

# (put your own initials here)echo the date to the console every

# 15minutes between 6pm and 6am

0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console

保存并退出。确信前面5个域用空格分隔。

在 上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些 系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为 cron命令的参数:

$ crontab davecron

现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。

同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。

2). 列出crontab文件

为了列出crontab文件,可以用:

$ crontab -l

0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:

$ crontab -l > $HOME/mycron

这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

3). 编辑crontab文件

如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:

$ crontab -e

可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

$ crontab -l

# (crondave installed on Tue May 4 13:07:43 1999)

# DT:ech the date to the console every 30 minites

0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

4). 删除crontab文件

要删除crontab文件,可以用:

$ crontab -r

5). 恢复丢失的crontab文件

如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:

$ crontab <filename>

其中,<filename>是你在$ H O M E目录中副本的文件名。

我建议你在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。
 5.使用实例

实例1:每1分钟执行一次command

命令:

* * * * * command

 

实例2:每小时的第3和第15分钟执行

命令:

3,15 * * * * command

 

实例3:在上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * * command

 

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 */2 * * command

 

实例5:每个星期一的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * 1 command

 

实例6:每晚的21:30重启smb 

命令:

30 21 * * * /etc/init.d/smb restart

 

实例7:每月1、10、22日的4 : 45重启smb 

命令:

45 4 1,10,22 * * /etc/init.d/smb restart

 

实例8:每周六、周日的1 : 10重启smb

命令:

10 1 * * 6,0 /etc/init.d/smb restart

 

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb 

命令:

0,30 18-23 * * * /etc/init.d/smb restart

 

实例10:每星期六的晚上11 : 00 pm重启smb 

命令:

0 23 * * 6 /etc/init.d/smb restart

 

实例11:每一小时重启smb 

命令:

* */1 * * * /etc/init.d/smb restart

 

实例12:晚上11点到早上7点之间,每隔一小时重启smb 

命令:

* 23-7/1 * * * /etc/init.d/smb restart

 

实例13:每月的4号与每周一到周三的11点重启smb 

命令:

0 11 4 * mon-wed /etc/init.d/smb restart

 

实例14:一月一号的4点重启smb 

命令:

0 4 1 jan * /etc/init.d/smb restart

实例15:每小时执行/etc/cron.hourly目录内的脚本

命令:

01   *   *   *   *     root run-parts /etc/cron.hourly

说明:

run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

四、使用注意事项

注意环境变量问题

有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1)脚本中涉及文件路径时写全局路径;

2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

注意清理系统用户的邮件日志

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

系统级任务调度与用户级任务调度

系 统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

其他注意事项

新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。

千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。

在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。

Linux如何定时同步文件到其他服务器上?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5212 次浏览 • 2019-06-26 11:18 • 来自相关话题

Nginx请求报错400如何解决?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 1384 次浏览 • 2023-07-19 12:33 • 来自相关话题

Nginx服务器端怎么解决font字体文件跨域?

回复

前端开发zkbhj 回复了问题 • 1 人关注 • 2 个回复 • 5850 次浏览 • 2022-12-08 13:52 • 来自相关话题

如何将curl接口中的返回内容输出到指定文件中?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 7853 次浏览 • 2020-01-02 11:14 • 来自相关话题

Linux如何定时删除某个目录下的所有文件,如日志文件?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4955 次浏览 • 2019-12-02 11:39 • 来自相关话题

Linux如何查找文件内指定内容并复制到新文件中?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5628 次浏览 • 2019-11-08 14:58 • 来自相关话题

如何查看Linux中当前被占用的端口号?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4291 次浏览 • 2019-10-27 10:03 • 来自相关话题

Linux如何创建目录链接?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 4660 次浏览 • 2019-09-26 17:58 • 来自相关话题

Linux如何定时同步文件到其他服务器上?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5212 次浏览 • 2019-06-26 11:18 • 来自相关话题

如何在Linux上查找大文件或者目录?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5604 次浏览 • 2018-10-18 17:53 • 来自相关话题

如何在Linux安装java运行环境?

回复

Javazkbhj 回复了问题 • 1 人关注 • 1 个回复 • 5754 次浏览 • 2018-09-16 22:52 • 来自相关话题

Nginx+PHP-FPM架构,结合PHP8.1搭建应用服务器时的一些总结和记录

PHPzkbhj 发表了文章 • 0 个评论 • 2191 次浏览 • 2022-12-08 14:07 • 来自相关话题

最近在做一个项目,使用了PHP8.1语言版本,语言框架使用的是Yii2的最新版本,然后再搭建服务器环境和部署应用的过程中遇到了一些问题,现总结如下,给同样场景可能会遇到一些类似问题的你提供一些解决方案,既然已经踩过一遍坑了,方便大家,也方便后续回顾总结。
 
一、编译安装PHP8.1:
因为编译过程中基本上遇到问题的概率并不大,我的编译过程还算顺利,因为服务器上保留了以前其他人运行的项目。PHP的版本是7.2.3,所以就编译安装了PHP8.1到一个指定的地方,然后独立安装的PHP-FPM。尽量不影响以前的项目运行。
我的编译配置信息(注意要一行,不能存在换行符):./configure --prefix=/usr/local/php8.1 --with-config-file-path=/usr/local/php8.1/etc --with-curl --with-freetype --enable-gd --with-jpeg --with-gettext --with-kerberos --with-libdir=lib64 --with-libxml --with-mysqli --with-openssl --with-pdo-mysql --with-pdo-sqlite --with-pear --enable-sockets --with-mhash --with-ldap-sasl --with-xsl --with-zlib -with-bz2 --with-iconv --enable-fpm --enable-pdo --enable-bcmath --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-soap --enable-sockets --enable-sysvsem --enable-xml --enable-sysvsem --enable-cli --enable-opcache --enable-intl --enable-calendar --enable-static --enable-mysqlnd最终我把编译好的php-fpm文件复制到了我的PHP8.1目录下,并完成了配置启动。这会儿还一切看似顺利。
 
编译过程中遇到了一个问题是:
configure: error: iconv does not support errno
 优先参考网上的解决方案安装缺失的iconv,如果不行,在运行configure之前先运行:
export LDFLAGS="$LDFLAGS -liconv"参考官网bug讨论 https://bugs.php.net/bug.php?id=80585,在此对歪果友人诚挚的感谢。

二、部署应用:
搭建好之后,顺利启动PHP-FPM服务器,监听端口9000,然后再Nginx配置文件中,将请求信息直接给到9000端口来处理,这里就有一些“东西”要注意了,否则就遇到了下面的问题:
 
问题1:部署应用之后,请求失败,页面返回“File not Found”,然后查看Nginx的报错日志,显示信息是:2022/12/08 13:15:51 [error] 31547#0: *29582 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 119.116.237.75, server: web.*.com, request: "GET /site/user-agreement HTTP/2.0", upstream: "fastcgi://127.0.0.1:9000", host: "web*.*com"网上说中问题, 比如php-fpm的 运行group和user不对啦,应用目录权限不足啦,但我发现根本原因是在Nginx转发时,少了一个重要的配置信息。
由于我的yii2项目启用了 URLManage功能,为了让链接看起来更漂亮一些,所以需要在Nginx配置文件中加入下面的这个配置:if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}

所以,完整的转发配置应该是:location / {
fastcgi_pass 127.0.0.1:9000;
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}所以这块,大家应该注意一下,更改完,重新启动Nginx服务之后,项目正常启动了!
 
问题二、页面图标显示异常:
由于使用了第三方图标工具,打开F12工具之后,发现是静态资源服务器访问字体文件时显示跨域:Access to Font at “xxx” from origin “xxx” has been by CORS plicy:
No ‘Access-Control-Allow-Origin’header is present on the requested resource.
Origin “xxx” is therefore not allowed access.这时候,只需要在静态资源服务器的Nginx配置文件中增加下面的配置项即可:location ~* .(eot|ttf|woff|swoff2|svg|otf)$ {
add_header Access-Control-Allow-Origin [url]http://www.zkbhj.com;[/url] //只允许单域名或者 ‘*' 。不推荐 ‘*' ,会导致安全问题
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
} 查看全部
最近在做一个项目,使用了PHP8.1语言版本,语言框架使用的是Yii2的最新版本,然后再搭建服务器环境和部署应用的过程中遇到了一些问题,现总结如下,给同样场景可能会遇到一些类似问题的你提供一些解决方案,既然已经踩过一遍坑了,方便大家,也方便后续回顾总结。
 
一、编译安装PHP8.1:
因为编译过程中基本上遇到问题的概率并不大,我的编译过程还算顺利,因为服务器上保留了以前其他人运行的项目。PHP的版本是7.2.3,所以就编译安装了PHP8.1到一个指定的地方,然后独立安装的PHP-FPM。尽量不影响以前的项目运行。
我的编译配置信息(注意要一行,不能存在换行符):
./configure --prefix=/usr/local/php8.1 --with-config-file-path=/usr/local/php8.1/etc --with-curl --with-freetype --enable-gd --with-jpeg --with-gettext --with-kerberos --with-libdir=lib64 --with-libxml --with-mysqli --with-openssl --with-pdo-mysql --with-pdo-sqlite --with-pear --enable-sockets --with-mhash --with-ldap-sasl --with-xsl --with-zlib -with-bz2 --with-iconv --enable-fpm --enable-pdo --enable-bcmath  --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-soap --enable-sockets --enable-sysvsem --enable-xml --enable-sysvsem --enable-cli --enable-opcache --enable-intl --enable-calendar --enable-static --enable-mysqlnd
最终我把编译好的php-fpm文件复制到了我的PHP8.1目录下,并完成了配置启动。这会儿还一切看似顺利。
 
编译过程中遇到了一个问题是:
configure: error: iconv does not support errno

 优先参考网上的解决方案安装缺失的iconv,如果不行,在运行configure之前先运行:
export LDFLAGS="$LDFLAGS -liconv"
参考官网bug讨论 https://bugs.php.net/bug.php?id=80585,在此对歪果友人诚挚的感谢。

二、部署应用:
搭建好之后,顺利启动PHP-FPM服务器,监听端口9000,然后再Nginx配置文件中,将请求信息直接给到9000端口来处理,这里就有一些“东西”要注意了,否则就遇到了下面的问题:
 
问题1:部署应用之后,请求失败,页面返回“File not Found”,然后查看Nginx的报错日志,显示信息是:
2022/12/08 13:15:51 [error] 31547#0: *29582 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 119.116.237.75, server: web.*.com, request: "GET /site/user-agreement HTTP/2.0", upstream: "fastcgi://127.0.0.1:9000", host: "web*.*com"
网上说中问题, 比如php-fpm的 运行group和user不对啦,应用目录权限不足啦,但我发现根本原因是在Nginx转发时,少了一个重要的配置信息。
由于我的yii2项目启用了 URLManage功能,为了让链接看起来更漂亮一些,所以需要在Nginx配置文件中加入下面的这个配置:
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}

所以,完整的转发配置应该是:
location / {
fastcgi_pass 127.0.0.1:9000;
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
所以这块,大家应该注意一下,更改完,重新启动Nginx服务之后,项目正常启动了!
 
问题二、页面图标显示异常:
由于使用了第三方图标工具,打开F12工具之后,发现是静态资源服务器访问字体文件时显示跨域:
Access to Font at “xxx” from origin “xxx” has been by CORS plicy:
No ‘Access-Control-Allow-Origin’header is present on the requested resource.
Origin “xxx” is therefore not allowed access.
这时候,只需要在静态资源服务器的Nginx配置文件中增加下面的配置项即可:
location ~* .(eot|ttf|woff|swoff2|svg|otf)$ {
add_header Access-Control-Allow-Origin [url]http://www.zkbhj.com;[/url] //只允许单域名或者 ‘*' 。不推荐 ‘*' ,会导致安全问题
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}

Linux下的crontab命令详细解析

服务器zkbhj 发表了文章 • 0 个评论 • 2565 次浏览 • 2019-09-02 10:20 • 来自相关话题

linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。

一、crond简介

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

[root@localhost ~]# cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=””HOME=/

# run-parts

51 * * * * root run-parts /etc/cron.hourly

24 7 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

[root@localhost ~]#

前 四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行 命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

使用者权限文件:

文件:

/etc/cron.deny

说明:

该文件中所列用户不允许使用crontab命令

文件:

/etc/cron.allow

说明:

该文件中所列用户允许使用crontab命令

文件:

/var/spool/cron/

说明:

所有用户crontab文件存放的目录,以用户名命名

crontab文件的含义:

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command

其中:

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。





 
在以上各个字段中,还可以使用以下特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

二、crond服务

安装crontab:

yum install crontabs

服务操作说明:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

查看crontab服务状态:

service crond status

手动启动crontab服务:

service crond start

查看crontab服务是否已设置为开机启动,执行命令:

ntsysv

加入开机自动启动:

chkconfig –level 35 crond on

三、crontab命令详解

1.命令格式:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

2.命令功能:

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。

3.命令参数:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

4.常用方法:

1). 创建一个新的crontab文件

在 考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑 crontab文件。9 9 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$ HOME目录下的. profile文件,在其 中加入这样一行:

EDITOR=vi; export EDITOR

然后保存并退出。不妨创建一个名为<user> cron的文件,其中<user>是用户名,例如, davecron。在该文件中加入如下的内容。

# (put your own initials here)echo the date to the console every

# 15minutes between 6pm and 6am

0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console

保存并退出。确信前面5个域用空格分隔。

在 上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些 系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为 cron命令的参数:

$ crontab davecron

现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。

同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。

2). 列出crontab文件

为了列出crontab文件,可以用:

$ crontab -l

0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:

$ crontab -l > $HOME/mycron

这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

3). 编辑crontab文件

如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:

$ crontab -e

可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

$ crontab -l

# (crondave installed on Tue May 4 13:07:43 1999)

# DT:ech the date to the console every 30 minites

0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

4). 删除crontab文件

要删除crontab文件,可以用:

$ crontab -r

5). 恢复丢失的crontab文件

如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:

$ crontab <filename>

其中,<filename>是你在$ H O M E目录中副本的文件名。

我建议你在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。
 5.使用实例

实例1:每1分钟执行一次command

命令:

* * * * * command

 

实例2:每小时的第3和第15分钟执行

命令:

3,15 * * * * command

 

实例3:在上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * * command

 

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 */2 * * command

 

实例5:每个星期一的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * 1 command

 

实例6:每晚的21:30重启smb 

命令:

30 21 * * * /etc/init.d/smb restart

 

实例7:每月1、10、22日的4 : 45重启smb 

命令:

45 4 1,10,22 * * /etc/init.d/smb restart

 

实例8:每周六、周日的1 : 10重启smb

命令:

10 1 * * 6,0 /etc/init.d/smb restart

 

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb 

命令:

0,30 18-23 * * * /etc/init.d/smb restart

 

实例10:每星期六的晚上11 : 00 pm重启smb 

命令:

0 23 * * 6 /etc/init.d/smb restart

 

实例11:每一小时重启smb 

命令:

* */1 * * * /etc/init.d/smb restart

 

实例12:晚上11点到早上7点之间,每隔一小时重启smb 

命令:

* 23-7/1 * * * /etc/init.d/smb restart

 

实例13:每月的4号与每周一到周三的11点重启smb 

命令:

0 11 4 * mon-wed /etc/init.d/smb restart

 

实例14:一月一号的4点重启smb 

命令:

0 4 1 jan * /etc/init.d/smb restart

实例15:每小时执行/etc/cron.hourly目录内的脚本

命令:

01   *   *   *   *     root run-parts /etc/cron.hourly

说明:

run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

四、使用注意事项

注意环境变量问题

有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1)脚本中涉及文件路径时写全局路径;

2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

注意清理系统用户的邮件日志

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

系统级任务调度与用户级任务调度

系 统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

其他注意事项

新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。

千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。

在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。 查看全部
linux 系统则是由 cron (crond) 这个系统服务来控制的。Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的。另 外, 由于使用者自己也可以设置计划任务,所以, Linux 系统也提供了使用者控制计划任务的命令 :crontab 命令。

一、crond简介

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

[root@localhost ~]# cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=””HOME=/

# run-parts

51 * * * * root run-parts /etc/cron.hourly

24 7 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

[root@localhost ~]#

前 四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行 命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

使用者权限文件:

文件:

/etc/cron.deny

说明:

该文件中所列用户不允许使用crontab命令

文件:

/etc/cron.allow

说明:

该文件中所列用户允许使用crontab命令

文件:

/var/spool/cron/

说明:

所有用户crontab文件存放的目录,以用户名命名

crontab文件的含义:

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

minute   hour   day   month   week   command

其中:

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

QQ截图20190902101714.jpg

 
在以上各个字段中,还可以使用以下特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

二、crond服务

安装crontab:

yum install crontabs

服务操作说明:

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

查看crontab服务状态:

service crond status

手动启动crontab服务:

service crond start

查看crontab服务是否已设置为开机启动,执行命令:

ntsysv

加入开机自动启动:

chkconfig –level 35 crond on

三、crontab命令详解

1.命令格式:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

2.命令功能:

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。

3.命令参数:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

4.常用方法:

1). 创建一个新的crontab文件

在 考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑 crontab文件。9 9 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$ HOME目录下的. profile文件,在其 中加入这样一行:

EDITOR=vi; export EDITOR

然后保存并退出。不妨创建一个名为<user> cron的文件,其中<user>是用户名,例如, davecron。在该文件中加入如下的内容。

# (put your own initials here)echo the date to the console every

# 15minutes between 6pm and 6am

0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console

保存并退出。确信前面5个域用空格分隔。

在 上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些 系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为 cron命令的参数:

$ crontab davecron

现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。

同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。

2). 列出crontab文件

为了列出crontab文件,可以用:

$ crontab -l

0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:

$ crontab -l > $HOME/mycron

这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。

3). 编辑crontab文件

如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:

$ crontab -e

可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。

我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。

现在让我们使用前面讲过的crontab -l命令列出它的全部信息:

$ crontab -l

# (crondave installed on Tue May 4 13:07:43 1999)

# DT:ech the date to the console every 30 minites

0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month

30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

4). 删除crontab文件

要删除crontab文件,可以用:

$ crontab -r

5). 恢复丢失的crontab文件

如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:

$ crontab <filename>

其中,<filename>是你在$ H O M E目录中副本的文件名。

我建议你在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。

有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。
 5.使用实例

实例1:每1分钟执行一次command

命令:

* * * * * command

 

实例2:每小时的第3和第15分钟执行

命令:

3,15 * * * * command

 

实例3:在上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * * command

 

实例4:每隔两天的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 */2 * * command

 

实例5:每个星期一的上午8点到11点的第3和第15分钟执行

命令:

3,15 8-11 * * 1 command

 

实例6:每晚的21:30重启smb 

命令:

30 21 * * * /etc/init.d/smb restart

 

实例7:每月1、10、22日的4 : 45重启smb 

命令:

45 4 1,10,22 * * /etc/init.d/smb restart

 

实例8:每周六、周日的1 : 10重启smb

命令:

10 1 * * 6,0 /etc/init.d/smb restart

 

实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb 

命令:

0,30 18-23 * * * /etc/init.d/smb restart

 

实例10:每星期六的晚上11 : 00 pm重启smb 

命令:

0 23 * * 6 /etc/init.d/smb restart

 

实例11:每一小时重启smb 

命令:

* */1 * * * /etc/init.d/smb restart

 

实例12:晚上11点到早上7点之间,每隔一小时重启smb 

命令:

* 23-7/1 * * * /etc/init.d/smb restart

 

实例13:每月的4号与每周一到周三的11点重启smb 

命令:

0 11 4 * mon-wed /etc/init.d/smb restart

 

实例14:一月一号的4点重启smb 

命令:

0 4 1 jan * /etc/init.d/smb restart

实例15:每小时执行/etc/cron.hourly目录内的脚本

命令:

01   *   *   *   *     root run-parts /etc/cron.hourly

说明:

run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了

四、使用注意事项

注意环境变量问题

有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1)脚本中涉及文件路径时写全局路径;

2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

注意清理系统用户的邮件日志

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

系统级任务调度与用户级任务调度

系 统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

其他注意事项

新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。

当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。

千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。

在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。

一点点学习Linux:如何添加crontab计划任务?

服务器zkbhj 发表了文章 • 0 个评论 • 3552 次浏览 • 2018-11-13 11:53 • 来自相关话题

crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。可以用以下的方法启动、关闭这个服务:
/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置1.linux任务调度的工作主要分为以下两类:

系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。


2.crontab命令选项:

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数

crontab -l //列出某个用户cron服务的详细内容

crontab -r //删除某个用户的cron服务

crontab -e //编辑某个用户的cron服务

比如说root查看自己的cron设置:crontab -u root -l

再例如,root想删除fred的cron设置:crontab -u fred -r

在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e

进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

3.cron文件语法 分 小时 日 月 星期 命令

0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)4.记住几个特殊符号的含义:

"*"代表取值范围内的数字,

"/"代表"每",

"-"代表从某个数字到某个数字,

","分开几个离散的数字
 
5.举几个例子
5 * * * * ls //指定每小时的第5分钟执行一次ls命令

30 5 * * * ls //指定每天的 5:30 执行ls命令

30 7 8 * * ls //指定每月8号的7:30分执行ls命令

30 5 8 6 * ls //指定每年的6月8日5:30执行ls命令

30 6 * * 0 ls //指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]

30 3 10,20 * * ls //每月10号及20号的3:30执行ls命令[注:”,”用来连接多个不连续的时段]

25 8-11 * * * ls //每天8-11点的第25分钟执行ls命令[注:”-”用来连接连续的时段]

*/15 * * * * ls //每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]

30 6 */10 * * ls //每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令。 ]

50 7 * * * root run-parts /etc/cron.daily //每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件[ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]6.新增调度任务可用两种方法:

a.在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。

b.直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。 查看全部
crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。可以用以下的方法启动、关闭这个服务:
/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置
1.linux任务调度的工作主要分为以下两类:


系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。



2.crontab命令选项:

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数

crontab -l //列出某个用户cron服务的详细内容

crontab -r //删除某个用户的cron服务

crontab -e //编辑某个用户的cron服务

比如说root查看自己的cron设置:crontab -u root -l

再例如,root想删除fred的cron设置:crontab -u fred -r

在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e

进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

3.cron文件语法
  分     小时      日       月       星期      命令

0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)
4.记住几个特殊符号的含义:

"*"代表取值范围内的数字,

"/"代表"每",

"-"代表从某个数字到某个数字,

","分开几个离散的数字
 
5.举几个例子
5       *       *       *      *     ls              //指定每小时的第5分钟执行一次ls命令

30 5 * * * ls //指定每天的 5:30 执行ls命令

30 7 8 * * ls //指定每月8号的7:30分执行ls命令

30 5 8 6 * ls //指定每年的6月8日5:30执行ls命令

30 6 * * 0 ls //指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]

30 3 10,20 * * ls //每月10号及20号的3:30执行ls命令[注:”,”用来连接多个不连续的时段]

25 8-11 * * * ls //每天8-11点的第25分钟执行ls命令[注:”-”用来连接连续的时段]

*/15 * * * * ls //每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]

30 6 */10 * * ls //每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令。 ]

50 7 * * * root run-parts /etc/cron.daily //每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件[ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]
6.新增调度任务可用两种方法:

a.在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。

b.直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。

为什么Linux的Crond最小只支持分钟级别的定时任务?Crontab工作机制探究

服务器zkbhj 发表了文章 • 0 个评论 • 3565 次浏览 • 2018-10-17 15:21 • 来自相关话题

在开发过程中,经常会有用到计划任务的时候。一般来讲,常见的大部分需求也很好实现,Linux的定时任务简单地配置到crontab里面就可以了,设置方法也很简单,如下所示,6个参数依次表示为“分、时、日、月、周和具体任务”(示例为每天凌晨3点执行freshclam工作)。
[root@student ~]# crontab -l
0 3 * * * freshclam然而,从5个时间参数来看最小是精确到某一分钟执行。如果要想实现秒级的定时任务,那么该怎么做呢? 
首先,我们先探究下Linux的Crond工作的机制是怎么样的。
 cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。

cron 假定系统持续运行。如果当某任务被调度时系统不在运行,该任务就不会被执行。

要使用 cron 服务,你必须安装了 vixie-cron RPM 软件包,而且必须在运行crond 服务。要判定该软件包是否已安装,使用 rpm -q vixie-cron 命令。要判定该服务是否在运行,使用 /sbin/service crond status 命令。
 
配置
 
cron 的主配置文件是 /etc/crontab,它包括下面几行:SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly前四行是用来配置 cron 任务运行环境的变量。SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);PATH 变量定义用来执行命令的路径。cron 任务的输出被邮寄给MAILTO 变量定义的用户名。如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出。HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

/etc/crontab 文件中的每一行都代表一项任务,它的格式是:
minute hour day month dayofweek command 

minute — 分钟,从 0 到 59 之间的任何整数

hour — 小时,从 0 到 23 之间的任何整数

day — 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有效日期)

month — 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、feb 等等)

dayofweek — 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(或使用星期的英文简写如 sun、mon 等等)

command — 要执行的命令(命令可以是ls /proc >> /tmp/proc 之类的命令,也可以是执行你自行编写的脚本的命令。)

 
在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。

整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。

用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。

正斜线(/)可以用来指定间隔频率。在范围后加上 /<integer> 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。

开头为井号(#)的行是注释,不会被处理。

如你在 /etc/crontab 文件中所见,它使用run-parts 脚本来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly和/etc/cron.monthly 目录中的脚本,这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本。

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到 /etc/cron.d 目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。# record the memory usage of the system every monday
# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在/var/spool/cron 目录中,并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入crontab -e 命令,使用由 VISUAL 或 EDITOR环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和/etc/crontab 相同。当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,并写入文件/var/spool/cron/username 中。

cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及/var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。
 
 控制对 cron 的使用
 
/etc/cron.allow 和/etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。

无论使用控制文件中的规定如何,根用户都总是可以使用 cron。

如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且cron.deny 文件会被忽略。

如果 cron.allow 文件不存在,所有在cron.deny 中列出的用户都被禁止使用 cron。
 
启动和停止服务
 
要启动 cron 服务,使用 /sbin/service crond start 命令。要停止该服务,使用/sbin/service crond stop 命令。推荐你在引导时启动该服务。

由于Cron 是Linux的内置服务,可以用以下的方法启动、关闭这个服务:/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
要实现秒级的计划任务,可以使用开源项目:Quartz
详细:http://www.quartz-scheduler.org/
 参考文章:
https://blog.csdn.net/wenqiang1208/article/details/74853519
https://blog.csdn.net/foxman209/article/details/6759920?utm_source=blogxgwz4
  查看全部
在开发过程中,经常会有用到计划任务的时候。一般来讲,常见的大部分需求也很好实现,Linux的定时任务简单地配置到crontab里面就可以了,设置方法也很简单,如下所示,6个参数依次表示为“分、时、日、月、周和具体任务”(示例为每天凌晨3点执行freshclam工作)。
[root@student ~]# crontab -l
0 3 * * * freshclam
然而,从5个时间参数来看最小是精确到某一分钟执行。如果要想实现秒级的定时任务,那么该怎么做呢? 
首先,我们先探究下Linux的Crond工作的机制是怎么样的。
 cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。

cron 假定系统持续运行。如果当某任务被调度时系统不在运行,该任务就不会被执行。

要使用 cron 服务,你必须安装了 vixie-cron RPM 软件包,而且必须在运行crond 服务。要判定该软件包是否已安装,使用 rpm -q vixie-cron 命令。要判定该服务是否在运行,使用 /sbin/service crond status 命令。
 
配置
 
cron 的主配置文件是 /etc/crontab,它包括下面几行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前四行是用来配置 cron 任务运行环境的变量。SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);PATH 变量定义用来执行命令的路径。cron 任务的输出被邮寄给MAILTO 变量定义的用户名。如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出。HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

/etc/crontab 文件中的每一行都代表一项任务,它的格式是:
minute         hour         day         month         dayofweek         command
 


minute — 分钟,从 0 到 59 之间的任何整数

hour — 小时,从 0 到 23 之间的任何整数

day — 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有效日期)

month — 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、feb 等等)

dayofweek — 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(或使用星期的英文简写如 sun、mon 等等)

command — 要执行的命令(命令可以是ls /proc >> /tmp/proc 之类的命令,也可以是执行你自行编写的脚本的命令。)


 
在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。

整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。

用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。

正斜线(/)可以用来指定间隔频率。在范围后加上 /<integer> 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。

开头为井号(#)的行是注释,不会被处理。

如你在 /etc/crontab 文件中所见,它使用run-parts 脚本来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly和/etc/cron.monthly 目录中的脚本,这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本。

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到 /etc/cron.d 目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。
# record the memory usage of the system every monday
# at 3:30AM in the file /tmp/meminfo
30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
# run custom script the first day of every month at 4:10AM
10 4 1 * * /root/scripts/backup.sh
根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在/var/spool/cron 目录中,并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入crontab -e 命令,使用由 VISUAL 或 EDITOR环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和/etc/crontab 相同。当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,并写入文件/var/spool/cron/username 中。

cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及/var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。
 
 控制对 cron 的使用
 
/etc/cron.allow 和/etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。

无论使用控制文件中的规定如何,根用户都总是可以使用 cron。

如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且cron.deny 文件会被忽略。

如果 cron.allow 文件不存在,所有在cron.deny 中列出的用户都被禁止使用 cron。
 
启动和停止服务
 
要启动 cron 服务,使用 /sbin/service crond start 命令。要停止该服务,使用/sbin/service crond stop 命令。推荐你在引导时启动该服务。

由于Cron 是Linux的内置服务,可以用以下的方法启动、关闭这个服务:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

要实现秒级的计划任务,可以使用开源项目:Quartz
详细:http://www.quartz-scheduler.org/
 参考文章:
https://blog.csdn.net/wenqiang1208/article/details/74853519
https://blog.csdn.net/foxman209/article/details/6759920?utm_source=blogxgwz4
 

什么是双因子认证?双因子认证的好处是什么?

专业名词zkbhj 发表了文章 • 1 个评论 • 6773 次浏览 • 2018-09-19 15:08 • 来自相关话题

双因子认证(2FA)是指结合密码以及实物(信用卡、SMS手机、令牌或指纹等生物标志)两种条件对用户的身份进行认证的方法。这种方法已经得到了企业的广泛采用,特别是在对数据进行远程访问时,但在其它领域应用还十分有限。双因子身份认证的推广之所以受阻,主要是由于其需要使用额外的工具,而这一条件为IT和技术支持人员带来了不小的负担。其批评者还指出,这种安全保障措施仍然很容易遭受攻击,即在非常小的时间周期内,这种技术很容易受到中间人(man-in-the-middle)攻击(这也是采用严格SSL处理的主要原因)。实际上,除了这些障碍以外,现在我们已经开始认识到,不采用双因子认证所带来的隐含成本远远比采用双因子认证所需要的成本高得多。






双因子身份认证是确保远程访问安全性的最佳实践方式,但是这种技术也给了一些网络犯罪分子可乘之机。如果攻击者在获取到了大量身份凭证的情况下,他们就可以伪装成合法用户,而且还可以躲避安全防护软件的检测。很多公司都认为双因子认证机制是绝对可靠的,而且也没有采取一定的安全预防措施来防御攻击者的攻击以及系统后门。

在这篇文章中,我们将会站在攻击者的角度来对双因子身份验证机制进行从浅至深的分析,我们希望这篇文章能够帮助安全研究人员解决这项技术中目前所存在的一些问题。我将会对远程绕过双因子身份验证技术进行讨论,并且向大家描述如何绕过远程访问设备的双因子身份验证机制,并从内部网络环境的设备中窃取数据。

1)K.I.S.S-简单,有效

入侵设备的远程访问控制是攻击者首要解决的问题,因为它可以给攻击者提供设备的访问权限,并且降低被监测到的可能性。在合法远程访问工具的帮助下,攻击者不仅可以在目标主机中执行控制命令,而且还可以在身份验证机制的掩护下进行其他的一些攻击活动。

在某些较为困难的情况下,我们可以使用一些比较直接的方法来获取到我们所需的凭证:让目标用户代替我们来进行操作。我们只需进行一些简单的设置就可以制作一个完美的陷阱。

在下图中,我们可以看到两个不同的VPN登录页面。其中一个是公司的合法登录网站,另一个是由攻击者伪造的虚假登录页面。你能发现这两者之间的区别吗?





 
分辨不出吗?没错,你的客户也一样分辨不出。在社会工程学工具(SET)的帮助下,任何人都可以快速地复制出一个外部页面来欺骗用户(攻击者只需要将HTML页面中的本地资源地址(“/home/image/logo.png”)修改成外部引用地址(“mycompany.com/home/image/logo.png”)就可以了)。在一次完美的网络钓鱼攻击中,你可以引诱目标用户访问你所克隆出的虚假VPN身份验证页面,并且得到所有你需要的信息:用户名,密码,甚至是令牌码!

如果攻击者的操作速度足够快,那么他们还可以将凭证提交至虚假的VPN页面,然后利用这些信息来登录真实的VPN。如下图所示,攻击者可以将登录提交请求重定向至一个PHP脚本,然后这个脚本就会将提交过来的用户名,密码,以及其他的一些元数据写入服务器的日志文件中,这样攻击者就可以检测并获取到用户所提交的双因子身份验证信息了。




当攻击者通过了VPN的身份验证之后,他们就可以在安全检测软件检测到钓鱼攻击并进行安全响应之前,在目标主机中实现提权并获取到敏感数据。

2)电子邮件就是我们的敌人

数字令牌通常会需要一个同步代码,而为了保证其有效性,每一名用户的令牌都只会有一个唯一的同步码与之对应。同步码和算法是保证令牌安全性的因素,而且这两个因素也可以确保用户令牌能够与身份验证服务器的要求所匹配。当用户的VPN访问请求通过批准之后,很多公司会选择使用一种简单和友好的方式来向用户发送通知类的电子邮件。这些电子邮件中通常会包含有“seed“密钥和安装说明。但对于安全团队来说不幸的是,用户通常在阅读完这类电子邮件之后,却忘记将其删除了,这些电子邮件就这样躺在了用户的收件箱之中,等待着攻击者前来窃取。

攻击者可以在用户的电子邮箱中搜索敏感文件和有价值的信息(包括硬盘中的.PST和.OST文件)。在大多数情况下,攻击者只需要使用一个简单的PowerShell脚本就可以搜索用户邮箱中的敏感文件以及与RSA软令牌相关的.sdtid文件了。

3)双因子身份验证机制中的紧急模式

在很多的双因子身份验证产品中,都提供有一个名为“紧急访问”的代码,这种运行模式实际上是一种身份验证机制,如果用户丢失了令牌,但是又急需对数据进行远程访问,那么这种机制也可以允许用户进行临时性的VPN访问。下图显示的就是紧急访问模式的操作界面截图:




如上图所示,系统提供了一个身份验证的修复机制。对于攻击者而言,攻击者可以利用这种机制来远程访问目标系统。这些紧急访问码是非常不安全的,因为他们的有效日期可以被修改,这样一来,攻击者就可以利用这些紧急访问码来获取到目标系统的永久访问权限了。

总结

对于一名经验丰富的攻击者来说,他们有很多种方法可以对目标进行攻击,并绕过那些所谓的“安全防护措施“。

不幸的是,很多公司太过于相信那些所谓的安全解决方案了,例如双因子身份验证。如果安全技术人员没有采取一些必要的安全保障措施,那么这种安全技术也不能保证公司的安全。如果安全技术人员忽略了这一点,那么攻击者就可以利用如上文所述的一些攻击方法破坏双因子身份验证技术本该带来的安全性。

在此,我还需要感谢Andrew Burkhardt, Evan Peña, 以及Justin Prosco为这篇文章所做出的贡献。
 
文章原文:https://www.fireeye.com/blog/t ... .html 查看全部
双因子认证(2FA)是指结合密码以及实物(信用卡、SMS手机、令牌或指纹等生物标志)两种条件对用户的身份进行认证的方法。这种方法已经得到了企业的广泛采用,特别是在对数据进行远程访问时,但在其它领域应用还十分有限。双因子身份认证的推广之所以受阻,主要是由于其需要使用额外的工具,而这一条件为IT和技术支持人员带来了不小的负担。其批评者还指出,这种安全保障措施仍然很容易遭受攻击,即在非常小的时间周期内,这种技术很容易受到中间人(man-in-the-middle)攻击(这也是采用严格SSL处理的主要原因)。实际上,除了这些障碍以外,现在我们已经开始认识到,不采用双因子认证所带来的隐含成本远远比采用双因子认证所需要的成本高得多。

t01fc4acdc6ee66ec6e.jpg


双因子身份认证是确保远程访问安全性的最佳实践方式,但是这种技术也给了一些网络犯罪分子可乘之机。如果攻击者在获取到了大量身份凭证的情况下,他们就可以伪装成合法用户,而且还可以躲避安全防护软件的检测。很多公司都认为双因子认证机制是绝对可靠的,而且也没有采取一定的安全预防措施来防御攻击者的攻击以及系统后门。

在这篇文章中,我们将会站在攻击者的角度来对双因子身份验证机制进行从浅至深的分析,我们希望这篇文章能够帮助安全研究人员解决这项技术中目前所存在的一些问题。我将会对远程绕过双因子身份验证技术进行讨论,并且向大家描述如何绕过远程访问设备的双因子身份验证机制,并从内部网络环境的设备中窃取数据。

1)K.I.S.S-简单,有效

入侵设备的远程访问控制是攻击者首要解决的问题,因为它可以给攻击者提供设备的访问权限,并且降低被监测到的可能性。在合法远程访问工具的帮助下,攻击者不仅可以在目标主机中执行控制命令,而且还可以在身份验证机制的掩护下进行其他的一些攻击活动。

在某些较为困难的情况下,我们可以使用一些比较直接的方法来获取到我们所需的凭证:让目标用户代替我们来进行操作。我们只需进行一些简单的设置就可以制作一个完美的陷阱。

在下图中,我们可以看到两个不同的VPN登录页面。其中一个是公司的合法登录网站,另一个是由攻击者伪造的虚假登录页面。你能发现这两者之间的区别吗?

t01775f75e07e0a35a7.png

 
分辨不出吗?没错,你的客户也一样分辨不出。在社会工程学工具(SET)的帮助下,任何人都可以快速地复制出一个外部页面来欺骗用户(攻击者只需要将HTML页面中的本地资源地址(“/home/image/logo.png”)修改成外部引用地址(“mycompany.com/home/image/logo.png”)就可以了)。在一次完美的网络钓鱼攻击中,你可以引诱目标用户访问你所克隆出的虚假VPN身份验证页面,并且得到所有你需要的信息:用户名,密码,甚至是令牌码!

如果攻击者的操作速度足够快,那么他们还可以将凭证提交至虚假的VPN页面,然后利用这些信息来登录真实的VPN。如下图所示,攻击者可以将登录提交请求重定向至一个PHP脚本,然后这个脚本就会将提交过来的用户名,密码,以及其他的一些元数据写入服务器的日志文件中,这样攻击者就可以检测并获取到用户所提交的双因子身份验证信息了。
fig2.png

当攻击者通过了VPN的身份验证之后,他们就可以在安全检测软件检测到钓鱼攻击并进行安全响应之前,在目标主机中实现提权并获取到敏感数据。

2)电子邮件就是我们的敌人

数字令牌通常会需要一个同步代码,而为了保证其有效性,每一名用户的令牌都只会有一个唯一的同步码与之对应。同步码和算法是保证令牌安全性的因素,而且这两个因素也可以确保用户令牌能够与身份验证服务器的要求所匹配。当用户的VPN访问请求通过批准之后,很多公司会选择使用一种简单和友好的方式来向用户发送通知类的电子邮件。这些电子邮件中通常会包含有“seed“密钥和安装说明。但对于安全团队来说不幸的是,用户通常在阅读完这类电子邮件之后,却忘记将其删除了,这些电子邮件就这样躺在了用户的收件箱之中,等待着攻击者前来窃取。

攻击者可以在用户的电子邮箱中搜索敏感文件和有价值的信息(包括硬盘中的.PST和.OST文件)。在大多数情况下,攻击者只需要使用一个简单的PowerShell脚本就可以搜索用户邮箱中的敏感文件以及与RSA软令牌相关的.sdtid文件了。

3)双因子身份验证机制中的紧急模式

在很多的双因子身份验证产品中,都提供有一个名为“紧急访问”的代码,这种运行模式实际上是一种身份验证机制,如果用户丢失了令牌,但是又急需对数据进行远程访问,那么这种机制也可以允许用户进行临时性的VPN访问。下图显示的就是紧急访问模式的操作界面截图:
fig9.png

如上图所示,系统提供了一个身份验证的修复机制。对于攻击者而言,攻击者可以利用这种机制来远程访问目标系统。这些紧急访问码是非常不安全的,因为他们的有效日期可以被修改,这样一来,攻击者就可以利用这些紧急访问码来获取到目标系统的永久访问权限了。

总结

对于一名经验丰富的攻击者来说,他们有很多种方法可以对目标进行攻击,并绕过那些所谓的“安全防护措施“。

不幸的是,很多公司太过于相信那些所谓的安全解决方案了,例如双因子身份验证。如果安全技术人员没有采取一些必要的安全保障措施,那么这种安全技术也不能保证公司的安全。如果安全技术人员忽略了这一点,那么攻击者就可以利用如上文所述的一些攻击方法破坏双因子身份验证技术本该带来的安全性。

在此,我还需要感谢Andrew Burkhardt, Evan Peña, 以及Justin Prosco为这篇文章所做出的贡献。
 
文章原文:https://www.fireeye.com/blog/t ... .html

linux运维命令之ps、netstat、nmap和pmap

服务器zkbhj 发表了文章 • 0 个评论 • 3572 次浏览 • 2018-05-17 18:30 • 来自相关话题

1.先看ps,linux下面可不是p图的哦!

ps -ef 查询正在运行的进程信息,一般在该操作之后用grep和AWK提取需要的信息。

如:ps -ef|grep ssh 查看ssh进程

ps -ef|awk '{print $2}' 打印所有进程信息对应的端口号(PID)

ps -aux        列出目前所有的正在内存当中的程序

ps -ajxf        列出类似程序树的程序显示

ps -l             将目前属于您自己这次登入的 PID 与相关信息列示出来

ps -A            列出进程信息

ps -u root    列出用户root下进程信息

当然,ps只是一次获取信息,用top命令就可以显示进程信息,并实时更新

2.再看netstat,这个命令用于显示各种网络相关信息,如网络连接、路由表、接口状态 (Interface Statistics)、masquerade 连接和多播成员 (Multicast Memberships) 等等。

netstat -a    列出所有端口 (包括监听和未监听的)

netstat -at   列出所有的TCP端口

netstat -au  列出所有的UDP端口

netstat -an  列出目前已经连接的和正在监听的端口号


netstat -ap  在上面命令的基础上列出连接的PID(进程号),用这个PID,可以使用KILL 来杀死连接

netstat -l     列出所有有监听的服务状态(还有另外一种说法,列出所有处于监听状态的 Sockets)

netstat -lx   列出所有监听 UNIX 端口

netstat -s   列出所有端口的统计信息

netstat -p   列出所有端口的端口号(PID)和进程名

netstat -ie  列出所有网络接口列表的详细信息,是ifconfig的替代命令

netstat -r    列出核心路由信息表

netstat -apn|grep PID/NAME  列出对应端口号和名称对应的信息

牛刀小试:

netstat -nat |awk '{print $6}'|sort|uniq -c     查看TCP所有状态




3.pmap命令用于报告进程的内存映射关系,是一个常用的Linux运维命令,在性能检测方面很有用。

pmap -x   显示拓展格式

pmap -d  显示设备格式

pmap -q  不显示头尾行




4.pmap命令几乎是黑客最喜欢的命令,现在来看下这个刺激而心跳的命令吧!

nmap -sP 192.168.0.*  寻找所有在线主机并打印其内网ip地址和MAC地址

nmap -sP 192.168.0.1/24  探测192.168.1.0网段有多少机器是开机的,并探测其MAC地址及MAC芯片信息


注意:上面两个命令等同

nmap -sP(Ping Scan)命令仅执行ping扫描(主机发现),然后打印出响应ping扫描的可用主机。不做进一步测试(如端口扫描或者OS探测)。

 并且 -sP选项能和任意发现探针类型(即-P*选项,-PN除外)组合使用。


nmap -sA  ip_addr        扫描指定ip地址对应的主机

nmap -Pn  ip_addr        扫描访问可能阻塞时,该命令比上一条更好用

nmap -PN (No ping)    跳过主机发现阶段 查看全部
1.先看ps,linux下面可不是p图的哦!

ps -ef 查询正在运行的进程信息,一般在该操作之后用grep和AWK提取需要的信息。

如:ps -ef|grep ssh 查看ssh进程

ps -ef|awk '{print $2}' 打印所有进程信息对应的端口号(PID)

ps -aux        列出目前所有的正在内存当中的程序

ps -ajxf        列出类似程序树的程序显示

ps -l             将目前属于您自己这次登入的 PID 与相关信息列示出来

ps -A            列出进程信息

ps -u root    列出用户root下进程信息

当然,ps只是一次获取信息,用top命令就可以显示进程信息,并实时更新

2.再看netstat,这个命令用于显示各种网络相关信息,如网络连接、路由表、接口状态 (Interface Statistics)、masquerade 连接和多播成员 (Multicast Memberships) 等等。

netstat -a    列出所有端口 (包括监听和未监听的)

netstat -at   列出所有的TCP端口

netstat -au  列出所有的UDP端口

netstat -an  列出目前已经连接的和正在监听的端口号


netstat -ap  在上面命令的基础上列出连接的PID(进程号),用这个PID,可以使用KILL 来杀死连接

netstat -l     列出所有有监听的服务状态(还有另外一种说法,列出所有处于监听状态的 Sockets)

netstat -lx   列出所有监听 UNIX 端口

netstat -s   列出所有端口的统计信息

netstat -p   列出所有端口的端口号(PID)和进程名

netstat -ie  列出所有网络接口列表的详细信息,是ifconfig的替代命令

netstat -r    列出核心路由信息表

netstat -apn|grep PID/NAME  列出对应端口号和名称对应的信息

牛刀小试:

netstat -nat |awk '{print $6}'|sort|uniq -c     查看TCP所有状态




3.pmap命令用于报告进程的内存映射关系,是一个常用的Linux运维命令,在性能检测方面很有用。

pmap -x   显示拓展格式

pmap -d  显示设备格式

pmap -q  不显示头尾行




4.pmap命令几乎是黑客最喜欢的命令,现在来看下这个刺激而心跳的命令吧!

nmap -sP 192.168.0.*  寻找所有在线主机并打印其内网ip地址和MAC地址

nmap -sP 192.168.0.1/24  探测192.168.1.0网段有多少机器是开机的,并探测其MAC地址及MAC芯片信息


注意:上面两个命令等同

nmap -sP(Ping Scan)命令仅执行ping扫描(主机发现),然后打印出响应ping扫描的可用主机。不做进一步测试(如端口扫描或者OS探测)。

 并且 -sP选项能和任意发现探针类型(即-P*选项,-PN除外)组合使用。


nmap -sA  ip_addr        扫描指定ip地址对应的主机

nmap -Pn  ip_addr        扫描访问可能阻塞时,该命令比上一条更好用

nmap -PN (No ping)    跳过主机发现阶段

Nginx Proxy buffer 工作原理

服务器zkbhj 发表了文章 • 0 个评论 • 3717 次浏览 • 2018-04-19 21:57 • 来自相关话题

proxy_buffer_size

语法: proxy_buffer_size the_size

默认值: proxy_buffer_size 4k/8k

上下文: http, server, location

该指令设置缓冲区大小,从代理后端服务器取得的第一部分的响应内容,会放到这里.

小的响应header通常位于这部分响应内容里边.

默认来说,该缓冲区大小等于指令 proxy_buffers所设置的;但是,你可以把它设置得更小.

proxy_buffering

语法: proxy_buffering on|off

默认值: proxy_buffering on

上下文: http, server, location

该指令开启从后端被代理服务器的响应内容缓冲.

如果缓冲区开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令proxy_buffer_size 和 proxy_buffers指定的缓冲区里边.

如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上。

如果缓冲区被关闭了,那么响应内容会按照获取内容的多少立刻同步传送到客户端。

nginx不尝试计算被代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令proxy_buffer_size指定的.

对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作

proxy_buffers

语法: proxy_buffers the_number is_size;

默认值: proxy_buffers 8 4k/8k;

上下文: http, server, location

该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。

proxy_busy_buffers_size

语法: proxy_busy_buffers_size size;

默认值: proxy_busy_buffers_size proxy_buffer_size * 2;

上下文: http, server, location, if



buffer工作原理

首先第一个概念是所有的这些proxy buffer参数是作用到每一个请求的。每一个请求会安按照参数的配置获得自己的buffer。proxy buffer不是global而是per request的。

proxy_buffering 是为了开启response buffering of the proxied server,开启后proxy_buffers和proxy_busy_buffers_size参数才会起作用。

无论proxy_buffering是否开启,proxy_buffer_size(main buffer)都是工作的,proxy_buffer_size所设置的buffer_size的作用是用来存储upstream端response的header。

在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这一整串buffer们。同时如果response的内容很大的话,Nginx会接收并把他们写入到temp_file里去。大小由proxy_max_temp_file_size控制。如果busy的buffer传输完了会从temp_file里面接着读数据,直到传输完毕。

一旦proxy_buffers设置的buffer被写入,直到buffer里面的数据被完整的传输完(传输到客户端),这个buffer将会一直处在busy状态,我们不能对这个buffer进行任何别的操作。所有处在busy状态的buffer size加起来不能超过proxy_busy_buffers_size,所以proxy_busy_buffers_size是用来控制同时传输到客户端的buffer数量的。 查看全部
proxy_buffer_size

语法: proxy_buffer_size the_size

默认值: proxy_buffer_size 4k/8k

上下文: http, server, location

该指令设置缓冲区大小,从代理后端服务器取得的第一部分的响应内容,会放到这里.

小的响应header通常位于这部分响应内容里边.

默认来说,该缓冲区大小等于指令 proxy_buffers所设置的;但是,你可以把它设置得更小.

proxy_buffering

语法: proxy_buffering on|off

默认值: proxy_buffering on

上下文: http, server, location

该指令开启从后端被代理服务器的响应内容缓冲.

如果缓冲区开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令proxy_buffer_size 和 proxy_buffers指定的缓冲区里边.

如果响应内容无法放在内存里边,那么部分内容会被写到磁盘上。

如果缓冲区被关闭了,那么响应内容会按照获取内容的多少立刻同步传送到客户端。

nginx不尝试计算被代理服务器整个响应内容的大小,nginx能从服务器接受的最大数据,是由指令proxy_buffer_size指定的.

对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作

proxy_buffers

语法: proxy_buffers the_number is_size;

默认值: proxy_buffers 8 4k/8k;

上下文: http, server, location

该指令设置缓冲区的大小和数量,从被代理的后端服务器取得的响应内容,会放置到这里. 默认情况下,一个缓冲区的大小等于内存页面大小,可能是4K也可能是8K,这取决于平台。

proxy_busy_buffers_size

语法: proxy_busy_buffers_size size;

默认值: proxy_busy_buffers_size proxy_buffer_size * 2;

上下文: http, server, location, if



buffer工作原理

首先第一个概念是所有的这些proxy buffer参数是作用到每一个请求的。每一个请求会安按照参数的配置获得自己的buffer。proxy buffer不是global而是per request的。

proxy_buffering 是为了开启response buffering of the proxied server,开启后proxy_buffers和proxy_busy_buffers_size参数才会起作用。

无论proxy_buffering是否开启,proxy_buffer_size(main buffer)都是工作的,proxy_buffer_size所设置的buffer_size的作用是用来存储upstream端response的header。

在proxy_buffering 开启的情况下,Nginx将会尽可能的读取所有的upstream端传输的数据到buffer,直到proxy_buffers设置的所有buffer们被写满或者数据被读取完(EOF)。此时nginx开始向客户端传输数据,会同时传输这一整串buffer们。同时如果response的内容很大的话,Nginx会接收并把他们写入到temp_file里去。大小由proxy_max_temp_file_size控制。如果busy的buffer传输完了会从temp_file里面接着读数据,直到传输完毕。

一旦proxy_buffers设置的buffer被写入,直到buffer里面的数据被完整的传输完(传输到客户端),这个buffer将会一直处在busy状态,我们不能对这个buffer进行任何别的操作。所有处在busy状态的buffer size加起来不能超过proxy_busy_buffers_size,所以proxy_busy_buffers_size是用来控制同时传输到客户端的buffer数量的。

PHP性能优化之php-fpm - 启动参数及重要配置详解

PHPzkbhj 发表了文章 • 0 个评论 • 3201 次浏览 • 2018-02-08 16:04 • 来自相关话题

约定几个目录
 
/usr/local/php/sbin/php-fpm/usr/local/php/etc/php-fpm.conf/usr/local/php/etc/php.ini
 
一,php-fpm的启动参数
#测试php-fpm配置
/usr/local/php/sbin/php-fpm -t
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf -t

#启动php-fpm
/usr/local/php/sbin/php-fpm
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf

#关闭php-fpm
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

#重启php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
二,php-fpm.conf重要参数详解
pid = run/php-fpm.pid
#pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启

error_log = log/php-fpm.log
#错误日志,默认在安装目录中的var/log/php-fpm.log

log_level = notice
#错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.

emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。

process_control_timeout = 0
#设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.

daemonize = yes
#后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。

listen = 127.0.0.1:9000
#fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: 'ip:port', 'port', '/path/to/unix/socket'. 每个进程池都需要设置.

listen.backlog = -1
#backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41

listen.allowed_clients = 127.0.0.1
#允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接

listen.owner = www
listen.group = www
listen.mode = 0666
#unix socket设置选项,如果使用tcp方式访问,这里注释即可。

user = www
group = www
#启动进程的帐户和组

pm = dynamic #对于专用服务器,pm可以设置为static。
#如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定:
pm.max_children #,子进程最大数
pm.start_servers #,启动时的进程数
pm.min_spare_servers #,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理

pm.max_requests = 1000
#设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.

pm.status_path = /status
#FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到

ping.path = /ping
#FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。

ping.response = pong
#用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.

request_terminate_timeout = 0
#设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用. 设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项。

request_slowlog_timeout = 10s
#当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0' 表示 'Off'

slowlog = log/$pool.log.slow
#慢请求的记录日志,配合request_slowlog_timeout使用

rlimit_files = 1024
#设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。

rlimit_core = 0
#设置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整数. 默认值: 系统定义值.

chroot =
#启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.

chdir =
#设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)

catch_workers_output = yes
#重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.三,常见错误及解决办法整理

1,request_terminate_timeout的值如果设置为0或者过长的时间,可能会引起file_get_contents的资源问题。
如果file_get_contents请求的远程资源如果反应过慢,file_get_contents就会一直卡在那里不会超时,我们知道php.ini 里面max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的request_terminate_timeout参数。

request_terminate_timeout默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免"502 Bad Gateway"。解决办法是request_terminate_timeout设置为10s或者一个合理的值,或者给file_get_contents加一个超时参数。
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 10 //设置一个超时时间,单位为秒
)
)
);
file_get_contents($str, 0, $ctx); 2,max_requests参数配置不当,可能会引起间歇性502错误:

http://hily.me/blog/2011/01/nginx-php-fpm-502/

pm.max_requests = 1000
#设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
这段配置的意思是,当一个 PHP-CGI 进程处理的请求数累积到 500 个后,自动重启该进程。

但是为什么要重启进程呢?

一般在项目中,我们多多少少都会用到一些 PHP 的第三方库,这些第三方库经常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。

正是因为这个机制,在高并发的站点中,经常导致 502 错误,我猜测原因是 PHP-FPM 对从 NGINX 过来的请求队列没处理好。不过我目前用的还是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否还存在这个问题。

目前我们的解决方法是,把这个值尽量设置大些,尽可能减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。在我们自己实际的生产环境中发现,内存泄漏并不明显,因此我们将这个值设置得非常大(204800)。大家要根据自己的实际情况设置这个值,不能盲目地加大。

话说回来,这套机制目的只为保证 PHP-CGI 不过分地占用内存,为何不通过检测内存的方式来处理呢?我非常认同高春辉所说的,通过设置进程的峰值内在占用量来重启 PHP-CGI 进程,会是更好的一个解决方案。

3,php-fpm的慢日志,debug及异常排查神器:
request_slowlog_timeout设置一个超时的参数,slowlog设置慢日志的存放位置,tail -f /var/log/www.slow.log即可看到执行过慢的php过程。
大家可以看到经常出现的网络读取超过、Mysql查询过慢的问题,根据提示信息再排查问题就有很明确的方向了。 查看全部
约定几个目录
 
  • /usr/local/php/sbin/php-fpm
  • /usr/local/php/etc/php-fpm.conf
  • /usr/local/php/etc/php.ini

 
一,php-fpm的启动参数
#测试php-fpm配置
/usr/local/php/sbin/php-fpm -t
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf -t

#启动php-fpm
/usr/local/php/sbin/php-fpm
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf

#关闭php-fpm
kill -INT `cat /usr/local/php/var/run/php-fpm.pid`

#重启php-fpm
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

二,php-fpm.conf重要参数详解
pid = run/php-fpm.pid
#pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启

error_log = log/php-fpm.log
#错误日志,默认在安装目录中的var/log/php-fpm.log

log_level = notice
#错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.

emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。

process_control_timeout = 0
#设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.

daemonize = yes
#后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。

listen = 127.0.0.1:9000
#fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: 'ip:port', 'port', '/path/to/unix/socket'. 每个进程池都需要设置.

listen.backlog = -1
#backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:http://www.3gyou.cc/?p=41

listen.allowed_clients = 127.0.0.1
#允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接

listen.owner = www
listen.group = www
listen.mode = 0666
#unix socket设置选项,如果使用tcp方式访问,这里注释即可。

user = www
group = www
#启动进程的帐户和组

pm = dynamic #对于专用服务器,pm可以设置为static。
#如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定:
pm.max_children #,子进程最大数
pm.start_servers #,启动时的进程数
pm.min_spare_servers #,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理

pm.max_requests = 1000
#设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.

pm.status_path = /status
#FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到

ping.path = /ping
#FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。

ping.response = pong
#用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.

request_terminate_timeout = 0
#设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用. 设置为 '0' 表示 'Off'.当经常出现502错误时可以尝试更改此选项。

request_slowlog_timeout = 10s
#当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0' 表示 'Off'

slowlog = log/$pool.log.slow
#慢请求的记录日志,配合request_slowlog_timeout使用

rlimit_files = 1024
#设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。

rlimit_core = 0
#设置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整数. 默认值: 系统定义值.

chroot =
#启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.

chdir =
#设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)

catch_workers_output = yes
#重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.
三,常见错误及解决办法整理

1,request_terminate_timeout的值如果设置为0或者过长的时间,可能会引起file_get_contents的资源问题。
如果file_get_contents请求的远程资源如果反应过慢,file_get_contents就会一直卡在那里不会超时,我们知道php.ini 里面max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的request_terminate_timeout参数。

request_terminate_timeout默认值为 0 秒,也就是说,PHP 脚本会一直执行下去。这样,当所有的 php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。修改该参数,设置一个 PHP 脚本最大执行时间是必要的,但是,治标不治本。例如改成 30s,如果发生 file_get_contents() 获取网页内容较慢的情况,这就意味着 150 个 php-cgi 进程,每秒钟只能处理 5 个请求,WebServer 同样很难避免"502 Bad Gateway"。解决办法是request_terminate_timeout设置为10s或者一个合理的值,或者给file_get_contents加一个超时参数。
$ctx = stream_context_create(array(  
'http' => array(
'timeout' => 10 //设置一个超时时间,单位为秒
)
)
);
file_get_contents($str, 0, $ctx);
2,max_requests参数配置不当,可能会引起间歇性502错误:

http://hily.me/blog/2011/01/nginx-php-fpm-502/

pm.max_requests = 1000
#设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0' 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
这段配置的意思是,当一个 PHP-CGI 进程处理的请求数累积到 500 个后,自动重启该进程。

但是为什么要重启进程呢?

一般在项目中,我们多多少少都会用到一些 PHP 的第三方库,这些第三方库经常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。

正是因为这个机制,在高并发的站点中,经常导致 502 错误,我猜测原因是 PHP-FPM 对从 NGINX 过来的请求队列没处理好。不过我目前用的还是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否还存在这个问题。

目前我们的解决方法是,把这个值尽量设置大些,尽可能减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。在我们自己实际的生产环境中发现,内存泄漏并不明显,因此我们将这个值设置得非常大(204800)。大家要根据自己的实际情况设置这个值,不能盲目地加大。

话说回来,这套机制目的只为保证 PHP-CGI 不过分地占用内存,为何不通过检测内存的方式来处理呢?我非常认同高春辉所说的,通过设置进程的峰值内在占用量来重启 PHP-CGI 进程,会是更好的一个解决方案。

3,php-fpm的慢日志,debug及异常排查神器:
request_slowlog_timeout设置一个超时的参数,slowlog设置慢日志的存放位置,tail -f /var/log/www.slow.log即可看到执行过慢的php过程。
大家可以看到经常出现的网络读取超过、Mysql查询过慢的问题,根据提示信息再排查问题就有很明确的方向了。

flume:高可用高可靠分布式海量日志采集聚合和传输系统

工具软件zkbhj 发表了文章 • 0 个评论 • 2806 次浏览 • 2017-11-16 10:04 • 来自相关话题

flume是分布式的日志收集系统,它将各个服务器中的数据收集起来并送到指定的地方去,比如说送到图中的HDFS,简单来说flume就是收集日志的。 





http://blog.csdn.net/a20114801 ... 44664 查看全部
flume是分布式的日志收集系统,它将各个服务器中的数据收集起来并送到指定的地方去,比如说送到图中的HDFS,简单来说flume就是收集日志的。 

QQ截图20171116100349.jpg

http://blog.csdn.net/a20114801 ... 44664

HTTP状态码详解和查阅手册

常识zkbhj 发表了文章 • 0 个评论 • 2610 次浏览 • 2017-11-13 11:42 • 来自相关话题

HTTP状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

HTTP状态码的英文为HTTP Status Code。

下面是常见的HTTP状态码:

200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误

HTTP状态码分类

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:





 
HTTP状态码列表 查看全部
HTTP状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。

HTTP状态码的英文为HTTP Status Code。

下面是常见的HTTP状态码:

200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误

HTTP状态码分类

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型:

QQ截图20171113113551.jpg

 
HTTP状态码列表
  积累沉淀一些和服务器相关的知识文章,总结先关的经验方法。