无需 cron 即可重复执行 bash 脚本

问题描述 投票:0回答:2

我需要每周六凌晨 2 点在一个非常小的基于 Linux 的系统上执行 bash 脚本,该系统不允许普通用户添加 cronjobs。特别是,系统每天都会将 crontab 文件重置为某些制造商的默认值。

因此,我需要一种方法来让这个脚本永远在后台运行,但它需要在 currentTime != 星期六凌晨 2 点时休眠(顺便说一句,这是一个备份脚本)。

我怎样才能做到这一点? 谢谢大家。

linux bash cron
2个回答
0
投票

如果您可以使用

at
,则可能可以自动调用调用自身的脚本:

创建脚本

at_periodic
,包含以下内容:

#!/usr/bin/env bash
timespec="$1"; shift
"$@"
printf "%q " "$(readlink -f -- "$0")" "$timespec" "$@" | at "$timespec"

现在可以运行了:

$ ./at_periodic "2am Saturday" command with -- complex arguments

0
投票

这是我可以从网上组装的:

runjob.sh
,可以扩展以将作业作为arg(但我不需要)

#!/bin/bash

PIDFILE="/tmp/runyauth.pid"

if [ -f "$PIDFILE" ]; then
  PID=$(cat "$PIDFILE")
  if [ -n "$PID" ] && ps -p "$PID" > /dev/null 2>&1; then
    echo $PID is already running
    exit 1
  else
    rm -f "$PIDFILE"
  fi
fi

echo $$ > "$PIDFILE"

while true; do
  # my job command here
  sleep 3600
done

trap "rm -f $PIDFILE" EXIT INT TERM

.profile
归功于Dave Dopson的答案的脚本路径解析(我的脚本位于.profile旁边,不在
$HOME
中,而是在符号链接路径上)

function runTheJob() {
    SOURCE=${BASH_SOURCE[0]}
    while [ -L "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
        DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )
        SOURCE=$(readlink "$SOURCE")
        [[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
    done
    DIR=$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )
    SCRIPT="$DIR/runyauth.sh"

    chmod +x $SCRIPT
    nohup $SCRIPT &
}

runTheJob
© www.soinside.com 2019 - 2024. All rights reserved.