如何模拟一个cron作业

veh*_*zzz 12 bash scripting perl cron

我想每天运行一个脚本(并且只在周末),但是,我不能使用cron作业.

我正在考虑进行无限循环,24小时睡眠,检查是否是周末,如果是,请执行脚本.

在bash on linux下它是一个很好的解决方案?

我目前的实施:

#! /bin/bash

 while [ true ]; do
    if [[ $(date +%u) -lt 6 ]]; then
               ./program
        else
             echo Today is a weekend, processing is skipped. Back to sleep.
    fi
    sleep  86400
done
Run Code Online (Sandbox Code Playgroud)

我将在下午5点发布这个脚本.

cam*_*amh 11

在没有每用户crontabs的那天,我经常使用(1)完成此操作.

#!/bin/sh
... do stuff...
at -f /path/to/me 5pm tomorrow
Run Code Online (Sandbox Code Playgroud)

这样,您的脚本就会运行并为下次调用安排自己.

我不认为你可以指定"下周末"的时间规格,所以你只需要每天重新安排并让你的脚本退出(在安排下一个工作后)如果不是周末.

编辑:或者不是每天安排,而是找出今天的情况并做好相应的安排.例如

day=Saturday
if [ $(date +%u) -eq 6 ] ; then day=Sunday ; fi
at -f /path/to/me 5pm next $day
Run Code Online (Sandbox Code Playgroud)

如果这个脚本在星期六运行,它会安排下一个星期日的下一次运行,否则它将在下周六运行.[ $(date +%A) = Saturday ]可能更具可读性,但是%A将提供特定于语言环境的字符串,因此如果更改语言环境可能不起作用.


dra*_*tun 5

对于Perl解决方案,请查看Schedule::CronCPAN模块:

use 5.012;
use warnings;
use Schedule::Cron;

my $cron = Schedule::Cron->new( sub {} );

# add weekend run @ 05:00 
$cron->add_entry('0 5 * * Sat,Sun', sub {
    system './program';
});

$cron->run();
Run Code Online (Sandbox Code Playgroud)