<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>花开的地方 &#187; crontab</title>
	<atom:link href="http://www.bsdmap.com/tag/crontab/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bsdmap.com</link>
	<description>花开，没有声音……</description>
	<lastBuildDate>Wed, 08 Feb 2012 13:39:21 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-alpha-19814</generator>
		<item>
		<title>正确使用cron</title>
		<link>http://www.bsdmap.com/2010/12/17/cron-daily/</link>
		<comments>http://www.bsdmap.com/2010/12/17/cron-daily/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 04:28:26 +0000</pubDate>
		<dc:creator>洪川</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[run-parts]]></category>

		<guid isPermaLink="false">http://www.bsdmap.com/?p=2825</guid>
		<description><![CDATA[/etc/cron.hourly、/etc/cron.daily 、/etc/cron.weekly、/etc/cron.monthly 目录下的脚本，是顺序执行的（在/etc/crontab中由 run-parts 命令启动）。所以，假如你有脚本需要延时（随机的时间）运行，放在这里是很不合适的，会影响到其他脚本的在“预料的时间”正确运行。 这个，看一下 run-parts 就知道： # Ignore *~ and *, scripts for i in $1/*[^~,] ; do [ -d $i ] &#38;&#38; continue # Don&#8217;t run *.{rpmsave,rpmorig,rpmnew,swp} scripts [ "${i%.rpmsave}" != "${i}" ] &#38;&#38; continue [ "${i%.rpmorig}" != "${i}" ] &#38;&#38; continue [ "${i%.rpmnew}" != "${i}" ] &#38;&#38; continue [ "${i%.swp}" != "${i}" [...]]]></description>
			<content:encoded><![CDATA[<p>/etc/cron.hourly、/etc/cron.daily 、/etc/cron.weekly、/etc/cron.monthly 目录下的脚本，是顺序执行的（在/etc/crontab中由 run-parts 命令启动）。所以，假如你有脚本需要延时（随机的时间）运行，放在这里是很不合适的，会影响到其他脚本的在“预料的时间”正确运行。</p>
<p>这个，看一下 run-parts 就知道：</p>
<p># Ignore *~ and *, scripts<br />
for i in $1/*[^~,] ; do<br />
[ -d $i ] &amp;&amp; continue<br />
# Don&#8217;t run *.{rpmsave,rpmorig,rpmnew,swp} scripts<br />
[ "${i%.rpmsave}" != "${i}" ] &amp;&amp; continue<br />
[ "${i%.rpmorig}" != "${i}" ] &amp;&amp; continue<br />
[ "${i%.rpmnew}" != "${i}" ] &amp;&amp; continue<br />
[ "${i%.swp}" != "${i}" ] &amp;&amp; continue<br />
[ "${i%,v}" != "${i}" ] &amp;&amp; continue</p>
<p>if [ -x $i ]; then<br />
$i 2&gt;&amp;1 | awk -v &#8220;progname=$i&#8221; \<br />
&#8216;progname {<br />
print progname &#8220;:\n&#8221;<br />
progname=&#8221;";<br />
}<br />
{ print; }&#8217;<br />
fi<br />
done</p>
<p>怎么办呢？</p>
<p>给任务脚本增加个参数，自已调用自己，放到后台，然后立即退出。</p>
<p>在任务脚本开始增加如下几行（注意 nohup 以及 &amp;&gt;/dev/null 的使用，使用不当，仍然会在此处sleep()等待。最好自己测试一下：run-part /etc/cron.daily ）：</p>
<p>if [ x"$1" = 'x' ];then<br />
nohup $0 background &amp;&gt;/dev/null &amp;<br />
exit 0<br />
fi</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>又遇到一个新问题：关于/etc/cron.d的。之前写过一篇，因为<a title="权限引起的crond不装载配置" href="http://www.bsdmap.com/2009/10/29/cron-d/" target="_blank">权限原因引起的cron.d目录下的配置不被加载</a>，这次又遇到了一个新问题。cron.d下的文件内容格式不正确，也会引起不加载：</p>
<p>﻿﻿﻿file hdmon.crontab.5_00<br />
hdmon.crontab.5_00: character Computer Graphics Metafile</p>
<p>查看文件内容，丝毫发现不了问题。</p>
<p>还有另一个需要注意的地方：</p>
<p>据说跟版本有关系，所以使用的时候最好自己试一下。/etc/cron.d下的文件，被crond加载以后，假如内容变化，RHEL4上的crond不会重新加载，而RHEL5上的则会。所以，想要通过程序控制/etc/cron.d下的文件，需要通过 crond 重新加载配置，或者，每次都使用不同的文件名。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
另外一个问题：</p>
<p>在 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly里的脚本运行和放在crontab配置里运行的脚本，是有一定的不同的。</p>
<p>要注意两个点：<br />
1. &#8220;%&#8221;号的特殊意思<br />
2. PATH变量。很多异常都是因为PATH变量引起的。调试的时候，手动执行一点儿问题没有，放到crontab中执行，就出错，绝大多数都是因为PATH的问题。好像默认情况下，cron将PATH初始化成PATH=/bin:/usr/bin.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bsdmap.com/2010/12/17/cron-daily/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>权限引起的crond不装载配置</title>
		<link>http://www.bsdmap.com/2009/10/29/cron-d/</link>
		<comments>http://www.bsdmap.com/2009/10/29/cron-d/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 14:57:02 +0000</pubDate>
		<dc:creator>洪川</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[crond]]></category>
		<category><![CDATA[crontab]]></category>

		<guid isPermaLink="false">http://www.bsdmap.com/?p=1496</guid>
		<description><![CDATA[/etc/cron.d下的配置文件不被装载故障处理心得： vixie-cron-4.1-76（crond）在 启动时 和 运行的过程中，会在整分钟（0秒的时刻）检查/etc/cron.d目录下的文件，假如权限、格式正确，则装载，并安排相应的任务。 假如某配置文件权限不对，那么则会跳过对该文件的检查，就是说即使将权限设置成正确的644，那么也不会被加载，需要手动reload配置：/etc/init.d/crond reload（或者再将文件改名——相当于加载新的权限正确的配置文件）。 而格式错误引起的配置无效，修改正确之后则不需要重新装载！ &#160;]]></description>
			<content:encoded><![CDATA[<p>/etc/cron.d下的配置文件不被装载故障处理心得：</p>
<p>vixie-cron-4.1-76（crond）在 <strong>启动时 </strong>和 <strong>运行的过程中</strong>，会在整分钟（0秒的时刻）检查/etc/cron.d目录下的文件，假如<strong>权限、格式正确</strong>，则装载，并安排相应的任务。</p>
<p>假如某配置文件权限不对，那么则会跳过对该文件的检查，就是说即使将权限设置成正确的644，那么也不会被加载，需要手动reload配置：/etc/init.d/crond reload（或者再将文件改名——相当于加载新的权限正确的配置文件）。</p>
<p>而格式错误引起的配置无效，修改正确之后则不需要重新装载！</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bsdmap.com/2009/10/29/cron-d/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>细读crontab手册</title>
		<link>http://www.bsdmap.com/2009/03/11/crontab-man/</link>
		<comments>http://www.bsdmap.com/2009/03/11/crontab-man/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 16:41:47 +0000</pubDate>
		<dc:creator>洪川</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[SHELL]]></category>
		<category><![CDATA[crontab]]></category>
		<category><![CDATA[crontab不运行]]></category>
		<category><![CDATA[crontab手册]]></category>
		<category><![CDATA[crontab格式]]></category>
		<category><![CDATA[crontab配置文件]]></category>

		<guid isPermaLink="false">http://www.bsdmap.com/?p=1015</guid>
		<description><![CDATA[一句话总结crontab（指这个应用、这个机制）的作用：&#8221;run this command at this time on this day&#8221;，在指定的日期、时间，运行指定的命令。下面是Linux 上crontab手册中的知识点，小结如下： 1. crontab文件“正式行”的开始 空行、以空格或者“tab”开行的行，被cron(daemon)忽略。 以#开始的行，作为注释被cron(daemon)忽略。 “注释”不允许与“命令”放在同一行（作为命令的注释），会被作为“第六段”，被cron(daemon)执行。 同样的，也不能放在设置环境变量的同一行。 2. 在crontab文件中指定环境变量 设置变量使用 name = value 这样的格式，&#8221;=&#8221;号左右的空格不是必须的。 几个变量默认已经被设置，比如： SHELL=/bin/sh HOEM=/home/nnix LOGNAME=nnix 其中SHELL和HOME可以重新设定，LOGNAME则不可（大概跟确定crontab文件的位置有关）。 默认，crontab会把执行的输出发送给crontab的所有者，除非重新设定变量： MAILTO=other_or_email 另外，当crontab发送输入时的邮件编码，可以通过设置变量 CONTENT_TYPE 和 CONTENT_TRANSFER_ENCODING 来使用正确的编码来发送邮件。 3. crontab 文件的分段 依次分别是 分（0-59） 时（0-23） 日（1-31） 月（1-23，或者英文名） 周（0-7，或者英文名，0和7均表示周日） 要执行的内容    4. 前五段：时间和日期 1）表示任意：* 号表示 “任意”（first-last)。 2）指定数字，表示指定的时间。 3）指定段，表示“开始-结束”内包含的数：比如3-6,表示3，4，5，6 4）指定列表：比如 “1,2,3,4&#8243;,&#8221;0-4,8-12&#8243; 5）指定“步长”：8-14/2 [...]]]></description>
			<content:encoded><![CDATA[<p>一句话总结crontab（指这个应用、这个机制）的作用：&#8221;run this command at this time on this day&#8221;，在指定的日期、时间，运行指定的命令。下面是Linux 上crontab手册中的知识点，小结如下：</p>
<p><strong>1. crontab文件“正式行”的开始</strong></p>
<p>空行、以空格或者“tab”开行的行，被cron(daemon)忽略。</p>
<p>以#开始的行，作为注释被cron(daemon)忽略。</p>
<p>“注释”不允许与“命令”放在同一行（作为命令的注释），会被作为“第六段”，被cron(daemon)执行。</p>
<p>同样的，也不能放在设置环境变量的同一行。</p>
<p><strong>2. 在crontab文件中指定环境变量</strong></p>
<p>设置变量使用</p>
<p>name = value</p>
<p>这样的格式，&#8221;=&#8221;号左右的空格不是必须的。</p>
<p>几个变量默认已经被设置，比如：</p>
<p>SHELL=/bin/sh<br />
HOEM=/home/nnix<br />
LOGNAME=nnix</p>
<p>其中SHELL和HOME可以重新设定，LOGNAME则不可（大概跟确定crontab文件的位置有关）。</p>
<p>默认，crontab会把执行的输出发送给crontab的所有者，除非重新设定变量：</p>
<p>MAILTO=other_or_email</p>
<p>另外，当crontab发送输入时的邮件编码，可以通过设置变量 CONTENT_TYPE 和 CONTENT_TRANSFER_ENCODING 来使用正确的编码来发送邮件。</p>
<p><strong>3. crontab 文件的分段</strong></p>
<p>依次分别是</p>
<ul>
<li>分（0-59）</li>
<li>时（0-23）</li>
<li>日（1-31）</li>
<li>月（1-23，或者英文名）</li>
<li>周（0-7，或者英文名，0和7均表示周日）</li>
<li>要执行的内容   </li>
</ul>
<p><strong>4. 前五段：时间和日期</strong></p>
<p>1）表示任意：* 号表示 “任意”（first-last)。</p>
<p>2）指定数字，表示指定的时间。</p>
<p>3）指定段，表示“开始-结束”内包含的数：比如3-6,表示3，4，5，6</p>
<p>4）指定列表：比如 “1,2,3,4&#8243;,&#8221;0-4,8-12&#8243;</p>
<p>5）指定“步长”：8-14/2 表示8，10，12，14</p>
<p><strong>5. 模糊的第六段：</strong></p>
<p>1）除去前五段，从第六段开始到换行符或者“%”为止，为要执行的命令。</p>
<p>2）默认第六段将被/bin/sh执行，除非在crontab文件中指定了非/bin/sh的SHELL变量。</p>
<p>3）第六段中的&#8221;%&#8221;号，除非前面加&#8221;\&#8221;号转交，否则，“%”号将结束命令行、换行的意义，并且其后的内容会被做为标准输入发送给前面的命令。</p>
<p><strong>6. 冲突的逻辑</strong></p>
<p>日期可以用月限定，也可以用“星期”指定，如果两个段有冲突（比如这两段不同时为“*”），那么，第六段的命令将在匹配任何一个的情况下运行，比如</p>
<p>&#8220;30 4 1,15 * 5&#8243;，将在每月的1号和15号 加 每个周五，上午4：30运行。</p>
<p><strong>7. crontab文件中的神密符号“%”</strong></p>
<p>可能会遇到的一个问题是，在第六段中需要使用date生成日志文件名，比如：</p>
<p>0   4   *   *   *   /opt/cron/mysql_dump.sh    &gt; /srv/logs/`date +%y-%m-%d`.dump.log</p>
<p>这时会发现crontab怎么也不运行这个mysql_dump.sh，也看不到有日志生成。这是因为在crontab文件中，&#8221;%&#8221;是有特殊含义的。假如不需要“%”的特殊作用，需要使用转义符转义。上面应该写成：</p>
<p>0   4   *   *   *   /opt/cron/mysql_dump.sh    &gt; /srv/logs/`date +\%y-\%m-\%d`.dump.log</p>
<p>“%”在crontab文件中，有“结束命令行”、“换行”、“重定向”的作用，比如：</p>
<p>0  22  * * 1-5  mail -s &#8220;It&#8217;s 10:00 pm&#8221; joe%Joe,%%Where are your kids?%</p>
<p>将会在周一至周五的22:00发送一分内容为：</p>
<p>Joe,&lt;换行&gt;<br />
&lt;换行&gt;<br />
Where are your kids?&lt;换行&gt;</p>
<p><strong>8. 不能理解的特殊用法</strong></p>
<p>       @reboot    :    Run once, at startup.</p>
<p>为了达到在开机后运行，且只运行一次的目的，除了这个，恐怕无法通过前五段的设置来实现吧？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bsdmap.com/2009/03/11/crontab-man/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>crontab</title>
		<link>http://www.bsdmap.com/2008/02/24/crontab/</link>
		<comments>http://www.bsdmap.com/2008/02/24/crontab/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 16:14:13 +0000</pubDate>
		<dc:creator>洪川</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[crontab]]></category>

		<guid isPermaLink="false">http://www.bsdmap.com/~nnix/2008/02/24/crontab/</guid>
		<description><![CDATA[第一道第五个字段的整数取值范围及意义是： 0～59 表示分 1～23 表示小时 1～31 表示日 1～12 表示月份 0～6 表示星期（其中0表示星期日） /etc/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在，而有另外一个文件/etc/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时cron.allow优先，如果都不存在，只有超级用户可以安排作业。 注：cron.allow和cron.deny的位置可能不尽相同。]]></description>
			<content:encoded><![CDATA[<p>第一道第五个字段的整数取值范围及意义是：</p>
<p>0～59 表示分</p>
<p>1～23 表示小时</p>
<p>1～31 表示日</p>
<p>1～12 表示月份</p>
<p>0～6 表示星期（其中0表示星期日）</p>
<p>/etc/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在，而有另外一个文件/etc/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时cron.allow优先，如果都不存在，只有超级用户可以安排作业。</p>
<p>注：cron.allow和cron.deny的位置可能不尽相同。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bsdmap.com/2008/02/24/crontab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

