shell – 重新安排工作
发布时间:2020-12-15 22:38:06 所属栏目:安全 来源:网络整理
导读:有没有办法更改使用unix at命令发出的作业的日期? 我需要这样做,因为我的应用程序同时安排了太多的工作,这将使机器停止运转. 解决方法 这可能取决于实现,但在我的系统上,我可以像这样重命名作业: $# Bash$sudo ls -l /var/spool/cron/atjobs-rwx------ 1 u
有没有办法更改使用unix at命令发出的作业的日期?
我需要这样做,因为我的应用程序同时安排了太多的工作,这将使机器停止运转. 解决方法
这可能取决于实现,但在我的系统上,我可以像这样重命名作业:
$# Bash $sudo ls -l /var/spool/cron/atjobs -rwx------ 1 username daemon 3782 Nov 29 11:24 a00078014854e8 $atq 120 Mon Nov 29 11:44:00 2010 a username $printf "%xn" $((16#14854e8 + 60*2)) # 2 hour delay 1485560 $sudo mv /var/spool/cron/atjobs/a00078014854e8 /var/spool/cron/atjobs/a0007801485560 $atq 120 Mon Nov 29 13:44:00 2010 a username 文件名中的最后8个十六进制数字是Unix Epoch中确定运行作业的时间的分钟数.按延迟的分钟数递增. 编辑: 下面是一个Bash脚本,用于自动执行上述步骤.以下是一些示例运行: 创造一份工作: $date Mon Nov 29 20:00:00 CST 2010 $echo true | at now + 1 hour $atq 140 Mon Nov 29 21:00:00 2010 a username 一小时后重新安排工作: $sudo atrs 140 60 Job 140 in Queue "a" rescheduled from Mon Nov 29 21:00:00 CST 2010 to Mon Nov 29 22:00:00 CST 2010 提前15分钟重新安排: $sudo atrs 140 -15 Job 140 in Queue "a" rescheduled from Mon Nov 29 22:00:00 CST 2010 to Mon Nov 29 21:45:00 CST 2010 现在添加一天: $sudo atrs 140 $((60 * 24)) Job 140 in Queue "a" rescheduled from Mon Nov 29 21:45:00 CST 2010 to Mon Nov 30 21:45:00 CST 2010 您可以指定队列: $sudo atrs -q b 141 120 做一个干运行: $sudo atrs -n 140 30 Job 140 in Queue "a" Current job time: Mon Nov 30 21:45:00 2010 Proposed job time: Mon Nov 30 22:15:00 2010 这是脚本: #!/bin/bash # atrs - reschedule at jobs # atrs [-n] [-q queue] job [-|+]minutes # by Dennis Williamson 2010-11-29 # in response to https://stackoverflow.com/questions/4304631/rescheduling-an-at-job # for Bash 3.2 or greater # this script assumes that the last eight characters of the at job filename is # a sequence of hex digits representing the number of minutes starting at # the Unix epoch that is the time that the job is scheduled to be run LC_COLLATE=C export LC_TIME=C shopt -s nullglob mvcmd=/bin/mv datecmd=/bin/date GREP_OPTIONS= grepcmd=/bin/grep atqcmd=/usr/bin/atq atjobs=/var/spool/cron/atjobs declare -r tab=$'t' declare -r NOEXIT=0 declare -r EXIT=1 # it's not necessary to bitmap the errors,but I just wanted to declare -r ERROPTS=1 declare -r ERROARG=2 declare -r ERRARGS=4 declare -r ERRQUNM=8 declare -r ERRNOJB=16 declare -r ERRMVFL=32 declare -r ERRNOCH=64 declare -r ERRNINT=128 declare -r DRYRUN=255 # not otherwise possible to reach this number queue=a err=0 error () { (( err |= ${2:-0} )) msg+="${3:+$3n}" if (( $1 == $EXIT )) then printf "$msg" printf "Usage: ${0##*/} [-n] [-q queue] job [-|+]minutesn" printf " the default queue is an" printf " -n = dry run (default if not superuser)n" exit $err else return fi } # Process options and arguments options=':q:nh' while getopts $options option do case $option in q ) queue=$OPTARG;; n ) execute=1; ret=$DRYRUN;; # do dry run h ) error $EXIT $DRYRUN;; ? ) if (( (err & ERROPTS) != ERROPTS )) then error $NOEXIT $ERROPTS "Unknown option." fi;; * ) error $NOEXIT $ERROARG "Missing option argument.";; esac done shift $(($OPTIND - 1)) if [[ ! $queue =~ ^[a-zA-Z=]$]] then error $NOEXIT $ERRQUNM "Invalid queue name." fi if (( $# != 2 )) then error $NOEXIT $ERRARGS "Job number and offset in minutes are required." fi if [[ $1 =~ ^[0-9]+$]] then job=$1 else error $NOEXIT $ERRNINT "Job number must be a positive integer." fi if [[ $2 =~ ^[-+]?[0-9]+$]] then minutes=$2 else error $NOEXIT $ERRNINT "Minutes must be an integer." fi if (( err != 0 )) then error $EXIT fi # make preparations if (( $EUID == 0 )) then printf -v old "%05x" "$job" prefix="$atjobs/$queue$old" file=($prefix*) if [[ -z $file || ! -e $file ]] then error $EXIT $ERRNOJB "Job not found." fi oldhex="${file#$prefix}" oldminutes=$((16#$oldhex)) newminutes=$((oldminutes + minutes)) printf -v newhex "%08x" "$newminutes" from=$($datecmd -d @"$(($oldminutes * 60))") to=$($datecmd -d @"$((newminutes * 60))") else if (( execute == 0 )) then printf "You must be superuser to reschedule jobs. The job will be listed instead.n" execute=1 # do dry run ret=$DRYRUN fi fi # perform action if (( execute == 0 )) then if [[ $file != $prefix$newhex ]] then if $mvcmd "$file" "$prefix$newhex" then printf 'Job %s in Queue "%s" rescheduledn' "$job" "$queue" printf "from %sn" "$from" printf "to %sn" "$to" else error $EXIT $ERRMVFL "Reschedule failed." fi else error $EXIT $ERRNOCH "No change,times are the same." fi else jobdate=$($atqcmd -q $queue | $grepcmd "^$job$tab") if [[ -n $jobdate ]] then jobdate=${jobdate#$job$tab} jobdate=${jobdate%% $queue *} newjobdate=$($datecmd +%c -d "$jobdate + $minutes minutes") if [[ $jobdate != $newjobdate ]] then printf 'Job %s in Queue "%s"n' "$job" "$queue" printf "Current job time: %sn" "$jobdate" printf "Proposed job time: %sn" "$newjobdate" else error $EXIT $ERRNOCH "Proposed time would result in no change." fi else error $EXIT $ERRNOJB "Job not found." fi fi exit $ret (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |