как мне заставить cron запустить задание прямо сейчас, для тестирования/отладки? не меняя расписание!

как мне заставить cron запустить задание прямо сейчас, для тестирования/отладки? не меняя расписание!

У меня есть задание cron, которое запланировано для ежедневного запуска. Помимо изменения расписания, есть ли другой способ выполнить тестовый запуск команды прямо сейчас, чтобы проверить, работает ли она так, как задумано?

EDIT: (из комментариев) Я знаю, что команда работает нормально, если ввести ее в оболочке (моей оболочке), но я хочу знать, работает ли она правильно, когда ее запускает cron, на нее могут влиять ENV или специфичные для оболочки вещи (~ расширение) или вещи, связанные с владением и разрешениями, или ...

решение1

Вы можете принудительно запустить crontab с помощью следующей команды:

run-parts /etc/cron.daily

решение2

Вы можете смоделировать пользовательскую среду cron, как описано в«Запуск задания cron вручную и немедленно». Это позволит вам протестировать работу задания при его запуске от имени пользователя cron.


Выдержка из ссылки:


Шаг 1: Я временно поместил эту строку в crontab пользователя:

* * * * *   /usr/bin/env > /home/username/tmp/cron-env

затем вынул его, как только файл был записан.

Шаг 2: Я сделал небольшой скрипт bash, запускаемый как cron, содержащий:

#!/bin/bash
/usr/bin/env -i $(cat /home/username/tmp/cron-env) "$@"

Итак, как пользователь, о котором идет речь, я смог

    run-as-cron /the/problematic/script --with arguments --and parameters

решение3

Насколько мне известно, нет способа сделать это напрямую, поскольку cron имеет особое назначение — запуск команд расписания в определенное время. Поэтому лучше всего вручную создать (временную) запись в crontab или написать скрипт, который удаляет и сбрасывает среду.

Объяснение фразы «удаляет и сбрасывает среду»:

Можно запустить скрипт-оболочку env -i(удаляющую среду), которая будет использовать сохраненную среду (необходимо экспортировать все переменные, возможно, предварительно установив их set -a) перед запуском скрипта.

Сохраненная среда будет средой по умолчанию для задания cron, записанной путем запуска env(или declare -pв зависимости от того, какую оболочку используют ваши задания cron) как cronjob, с сохранением его вывода.

решение4

После того, как мне самому понадобилось отлаживать задания cron, я написал следующий скрипт. Он пытается симулировать те же самые условия, что и cron, перед запуском команды (которая включает измененную среду, но также связана с неинтерактивными оболочками, отсутствием подключенного терминала и т. д.).

Вызовите его с вашей командой/скриптом в качестве аргумента, и у вас будет мгновенный и безболезненный способ отладки вашего задания cron. Он также размещен (и, возможно, обновлен) на GitHub:run-as-cron.sh:

#!/bin/bash
# Run as if it was called from cron, that is to say:
#  * with a modified environment
#  * with a specific shell, which may or may not be bash
#  * without an attached input terminal
#  * in a non-interactive shell

function usage(){
    echo "$0 - Run a script or a command as it would be in a cron job," \
                                                       "then display its output"
    echo "Usage:"
    echo "   $0 [command | script]"
}

if [ "$1" == "-h" -o "$1" == "--help" ]; then
    usage
    exit 0
fi

if [ $(whoami) != "root" ]; then
    echo "Only root is supported at the moment"
    exit 1
fi

# This file should contain the cron environment.
cron_env="/root/cron-env"
if [ ! -f "$cron_env" ]; then
    echo "Unable to find $cron_env"
    echo "To generate it, run \"/usr/bin/env > /root/cron-env\" as a cron job"
    exit 0
fi

# It will be a nightmare to expand "$@" inside a shell -c argument.
# Let's rather generate a string where we manually expand-and-quote the arguments
env_string="/usr/bin/env -i "
for envi in $(cat "$cron_env"); do
   env_string="${env_string} $envi "
done

cmd_string=""
for arg in "$@"; do
    cmd_string="${cmd_string} \"${arg}\" "
done

# Which shell should we use?
the_shell=$(grep -E "^SHELL=" /root/cron-env | sed 's/SHELL=//')
echo "Running with $the_shell the following command: $cmd_string"


# Let's redirect the output into files
# and provide /dev/null as input
# (so that the command is executed without an open terminal
# on any standard file descriptor)
so=$(mktemp "/tmp/fakecron.out.XXXX")
se=$(mktemp "/tmp/fakecron.err.XXXX")
"$the_shell" -c "$env_string $cmd_string" > "$so" 2> "$se"  < /dev/null

echo -e "Done. Here is \033[1mstdout\033[0m:"
cat "$so"
echo -e "Done. Here is \033[1mstderr\033[0m:"
cat "$se"
rm "$so" "$se"

Связанный контент