Назад | Перейти на главную страницу

Запускать сценарий оболочки при загрузке Linux, но только один раз в день

Поместите ваш скрипт в init.d, чтобы он запускался при загрузке.

Чтобы убедиться, что он выполняется только один раз в день, все, что вам нужно сделать, это сохранить дату предыдущего выполнения и сравнить ее с текущей датой. Это довольно просто сделать на любом скриптовом языке.

Я использую это. Приведенный ниже код сохраняется в исполняемый файл, имя depo, и вы читаете комментарий в файле.

#!/bin/bash

# depo = day-execute-per-onetime = execute onetime per day
# add argumets whose execute onetime per day

# Example: ./depo "uname -a" # let's try run twotimes

if [ $# = 0 ]; then
    echo "Missing arguments, add one or more commands what you want to execute. Like $ depo \"uname -a\" date";
    exit;
fi;

TODAY=`date +%Y-%m-%d`
HOME_DIR="$HOME/.depo/"
COMMAND=`echo $@ | sha1sum | cut -d ' ' -f1`

SYNC_FILE="$HOME_DIR/$COMMAND"
mkdir -p "$HOME_DIR"
touch "$SYNC_FILE"

SYNC_DATE=`cat "$SYNC_FILE"`
if [ "$SYNC_DATE" == "$TODAY" ]; then
    exit
fi

for arg; do
   eval $arg
done

echo $TODAY > "$SYNC_FILE"

Добавьте его в init.d. Пусть скрипт «прикоснется» небольшим файлом к ​​каталогу, к которому у него есть доступ, домашнему каталогу как непривилегированному пользователю (если ему не нужны другие привилегии). Не используйте tmp, поскольку у вас нет гарантий, что файл сохранится. Назовите файл именем процесса, найдите его и проверьте время последнего изменения на нем. Если это менее 86400 секунд назад, выйдите, иначе продолжайте. Выполняйте проверку перед тем, как «прикоснуться» к файлу, иначе вы всегда будете думать, что сценарий не запускался в последний день.

В системе Debian я бы поместил свой сценарий в /etc/cron.daily и просто установил анакрон.

Анакрон вероятно, инструмент, который вы ищете.

Не знаю, включает ли RHEL rpm для них, придется ли вам их искать или даже компилировать из исходников.

Вы должны использовать анакрон чтобы запустить это. Он используется для вещей, которые вы хотите раз в день.