2010-11-29 9 views
5

UNIX atコマンドで発行されたジョブの日付を変更する方法はありますか?atジョブの再スケジュール

私のアプリケーションでは、あまりにも多くのジョブが同時にスケジュールされているため、マシンがグラインドを停止するため、これを行う必要があります。

答えて

9

これはおそらく、実装依存であるが、私のシステム上で、私はそうのような仕事の名前を変更することができます

$ # 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 "%x\n" $((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エポックからの分の数です仕事を実行する。それを遅延させる分単位でインクリメントします。

編集:以下

上記の手順を自動化するための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 

は、1時間後のジョブを再スケジュール:

$ 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 http://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:+$3\n}" 
    if (($1 == $EXIT)) 
    then 
     printf "$msg" 
     printf "Usage: ${0##*/} [-n] [-q queue] job [-|+]minutes\n" 
     printf "  the default queue is a\n" 
     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" rescheduled\n' "$job" "$queue" 
      printf "from %s\n" "$from" 
      printf "to %s\n" "$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: %s\n" "$jobdate" 
      printf "Proposed job time: %s\n" "$newjobdate" 
     else 
      error $EXIT $ERRNOCH "Proposed time would result in no change." 
     fi 
    else 
     error $EXIT $ERRNOJB "Job not found." 
    fi 
fi 

exit $ret 
+0

少しハッキリですが、実際には機能します。それは本当に命を救う人でした。あなたはロック! –

+1

@Michael:ええと、私はそうだと思いますが、最初の場所でファイル名にスケジュールを格納するのはどこから来たのでしょうか。私は自分の答えを編集し、元の答えに概説した手順を自動化するスクリプトを追加しました。 –

+0

シェルスクリプトをありがとう!チャームのように働いた! +1 –

1

私は別の時間のためにそれらのスケジュールを変更する方法があるかどうかわからないんだけど、あなたは、このようなatから完全に削除することができます

まずリストの仕事:

$ at -l 
9944 2010-11-29 15:00 a dogbane 
9945 2010-11-29 15:00 a dogbane 

その後それらを削除してください:

$ at -d 9944 
$ at -d 9945 

必要に応じて再作成することができます。

3

これは仕事にのために新しいIDを割り当てます新しい時。

at -c OLDJOBID | at NEWTIME 
atrm OLDJOBID 
+0

これにより、ラッパーの内容が複製されます。 –

+0

@Dennisはい、そうです。しかし、それは同じラッパーのものでなければなりません、私はそれがラッパーのものが重複している点で実際にはそれほど大きな違いはないと思いました。 (同じラッパーのものでなければ、古いジョブのラッパーのものは2番目になるので、それが使われているものです)。 –

関連する問題