Linux crontab的底层实现

很多Linux发行版,如CentOs系统的/etc目录下,都有很多指定定时调度的文件夹,如每日运行、每小时运行、每周运行,只需要在该目录下放置希望调度的脚本即可。

如:

[root@test001 etc]# ll /etc/cron
cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ crontab cron.weekly/

OS屏蔽了具体实现,在底层实际上是调用了 run-parts 命令。该命令位于 /usr/bin/run-parts,原料是遍历用户预先放在目标文件夹下的可执行文件,按照系统预设周期定时执行,该脚本内容如下:

#!/bin/bash
# run-parts - concept taken from Debian

# keep going when something fails
set +e

if [ $# -lt 1 ]; then
	echo "Usage: run-parts [--list | --test] <dir>"
	exit 1
fi

while [ $# -gt 1 ]; do
	case $1 in
		--list)
			list=1
			shift
			break
			;;
		--test)
			test=1
			shift
			break
			;;
		--)
			# -- end of options
			shift
			break
			;;
		*)
			# directory
			break
			;;
	esac
done

if [ ! -d $1 ]; then
	echo "Not a directory: $1"
	exit 1
fi

if [ -f /etc/sysconfig/run-parts ]; then
	. /etc/sysconfig/run-parts
fi

# Ignore *~ and *, scripts
for i in $(LC_ALL=C; echo ${1%/}/*[^~,]) ; do
	[ -d $i ] && continue
	# Don't run *.{rpmsave,rpmorig,rpmnew,swp,cfsaved} scripts
	[ "${i%.cfsaved}" != "${i}" ] && continue
	[ "${i%.rpmsave}" != "${i}" ] && continue
        [ "${i%.rpmorig}" != "${i}" ] && continue
        [ "${i%.rpmnew}" != "${i}" ] && continue
        [ "${i%.swp}" != "${i}" ] && continue
	[ "${i%,v}" != "${i}" ] && continue

	# jobs.deny prevents specific files from being executed
	# jobs.allow prohibits all non-named jobs from being run.
	# can be used in conjunction but there's no reason to do so. 
	if [ -r $1/jobs.deny ]; then
		grep -q "^$(basename $i)$" $1/jobs.deny && continue
	fi
	if [ -r $1/jobs.allow ]; then
		grep -q "^$(basename $i)$" $1/jobs.allow || continue
	fi

	if [ -e $i ]; then
		if [ -r $1/whitelist ]; then
			grep -q "^$(basename $i)$" $1/whitelist && continue
		fi

		if [ ${list:-0} = 1 ]; then
			echo $i;
		elif [ -x $i ]; then
			if [ ${test:-0} = 1 ]; then
				echo $i;
				continue
			fi
			if [ "$RANDOMIZE" != "" ]; then
				let "rtime = $RANDOM"
				if [ "$RANDOMTIME" != "" ]; then
					let "rtime %= $RANDOMTIME"
				else
					let "rtime %= 300"
				fi
				sleep $rtime
			fi

			# run executable files
			logger -p cron.notice -t "run-parts($1)[$$]" "starting $(basename $i)"
			$i 2>&1 | awk -v "progname=$i" \
			      'progname {
				   print progname ":\n"
				   progname="";
			       }
			       { print; }'
			logger -i -p cron.notice -t "run-parts($1)" "finished $(basename $i)"
		fi
	fi
done

exit 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值