我需要每周六凌晨 2 点在一个非常小的基于 Linux 的系统上执行 bash 脚本,该系统不允许普通用户添加 cronjobs。特别是,系统每天都会将 crontab 文件重置为某些制造商的默认值。
因此,我需要一种方法来让这个脚本永远在后台运行,但它需要在 currentTime != 星期六凌晨 2 点时休眠(顺便说一句,这是一个备份脚本)。
我怎样才能做到这一点? 谢谢大家。
如果您可以使用
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
这是我可以从网上组装的:
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