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

У Вас есть много опций, включая su, login, ssh, и sudo.

Самый легкий путь состоит в том, чтобы выполнить su, например.

$ su otheruser

или

$ su - otheruser

Первый устанавливает Вашего пользователя на otheruser.

Второй устанавливает Вас пользователь на otheruser и исходные сценарии входа в систему otheruser's (например. .profile для sh или .login для csh), чтобы заставить его походить, Вы вошли в систему как тот пользователь.

Если otheruser root (или отсутствует, который также означает root), затем необходимо будет быть в wheel группа, согласно странице справочника:

значением по умолчанию только пользователи в wheel группа может переключиться на UID 0 (root).

Иначе вход в систему, например.

$ login
login: otheruser
Password:   

Или при выполнении sshd Вы могли бы использовать ssh, например.

$ ssh otheruser@localhost

Или Вы могли установить sudo использование портов.

# cd /usr/ports/security/sudo
# make && make install

или пакеты

# pkg_add -r sudo

См. sudo страницу справочника для деталей того, как выполнить ее.

150
11.12.2019, 23:25
9 ответов

Насколько я знаю, что нет никакого способа непосредственно сделать это, поскольку крон имеет особое назначение - рабочие команды расписаний в определенное время. Таким образом, лучшая вещь состоит в том, чтобы быть или вручную создать crontab запись или записать сценарий, который удаляет и сбрасывает среду.

31
27.01.2020, 19:28

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


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


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

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

, а затем удалил ее после записи файла.

Шаг 2 : Сделал небольшой сценарий bash run as-cron, содержащий:

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

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

run-as-cron /the/problematic/script --with arguments --and parameters
52
27.01.2020, 19:28

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

run-parts /etc/cron.daily
65
27.01.2020, 19:28

Я нашел решение, которое кажется немного лучше для моих целей (команды, показанные для CentOS / RHEL -похожи, но должны быть адаптированы практически везде ).

Для этого требуется libfaketime-. Вы можете собрать его самостоятельно из исходного кода по адресуhttps://github.com/wolfcw/libfaketimeили просто использовать один из множества пакетов изhttps://pkgs.org/download/libfaketime.

  1. Останов службы crond-service crond stop
  2. Выяснить, когда ваша служба должна запускаться -https://crontab.guru, очень полезно для этого.
  3. Запустите crond в режиме переднего плана с помощью faketimeинструмента libfaketime. (Он позволяет имитировать системный вызов для поиска времени для любых дочерних процессов ).
    1. Я бы не стал запускать это на рабочем сервере
    2. faketime '2019-10-17 07:59:50' /usr/sbin/crond -n -x test,sch
[root@user-crontesting-dvc-01 ~]# faketime '2019-10-17 07:59:50' /usr/sbin/crond -n -x sch
debug flags enabled: sch
[4841] cron started
log_it: (CRON 4841) INFO (Syslog will be used instead of sendmail.)
log_it: (CRON 4841) INFO (RANDOM_DELAY will be scaled with factor 34% if used.)
log_it: (CRON 4841) INFO (running with inotify support)
[4841] GMToff=0
log_it: (CRON 4841) INFO (@reboot jobs will be run at computer's startup.)
[4841] Target time=1571299200, sec-to-wait=11
user [root:0:0:...] cmd="/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1"
[4841] Target time=1571299260, sec-to-wait=60
log_it: (root 4844) CMD (/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1)
log_it: (root 4843) CMDOUT (/bin/bash: -c: line 0: syntax error near unexpected token `&')
log_it: (root 4843) CMDOUT (/bin/bash: -c: line 0: `/usr/libexec/myexc/crontesting.cron > /dev/null 2> &1')
-1
27.01.2020, 19:28

Не очень элегантно, но работает :вот что я использую для запуска задания на 5-й строке моего crontab:

 eval "$(crontab -l | sed -n '5p' | tr -s ' ' | cut -d' ' -f 6-)"

Он отображает crontab, получает 5-ю строку, заменяет несколько пробелов одним пробелом, берет все, начиная с 6-го столбца до конца, а затем запускает его с помощью eval.

-2
27.01.2020, 19:28

В CronitorCLI есть команда cronitor select, которая позволяет выбрать и запустить любое задание cron из командной строки. Вам не нужно создавать учетную запись Cronitor, чтобы использовать его.

https://cronitor.io/docs/using-cronitor-cli

Вот пример:

ubuntu@ip-10-0-0-112:~$ cronitor select

Use the arrow keys to navigate: ↓ ↑
? Select job to run:
▸ /var/runner/src/bin/batch_reports.py runner.settings.prod
  /var/runner/src/bin/trigger_reports.py runner.settings.prod
 ... etc...
11
27.01.2020, 19:28

Я цитирую ответ(посмотреть полностью)из сбоя сервера:


Выполнение команд crontab в пакете -:

crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done

для запуска под другим пользователем:

sudo -H -u username bash -c "crontab... "

-1
26.02.2020, 12:50

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

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

#!/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 route the output in a file
# and do not provide any input (so that the command is executed without an attached terminal)
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"
6
17.04.2020, 10:23

Ответ Даладима был мне полезен. Он запускает команду немедленно, а не через 59 секунд, как это делают ответы в стиле «* * * * *». Он представляет вывод, как только команда запускается.

Я немного расширил его, добавив возможность запуска от имени любого пользователя, а не только root, исправив некоторые краеугольные ошибки и добавив специальное сообщение с инструкциями по загрузке среды в соответствии с cron.

Я разместил его на GitHub .

Свяжите команду run -как -cron с этим файлом по вашему пути.

Если у вас есть такая запись в crontab:

0 0 * * * command.sh --option

проверь вот так:

run-as-cron command.sh --option

или как корень:

sudo run-as-cron command.sh --option

или как другой пользователь:

sudo su otheruser
run-as-cron command.sh --option

Обратите внимание, что в самый первый раз, когда вы запускаете это как пользователь, вам нужно будет добавить команду в crontab -eи подождать минуту, чтобы получить доступ к среде.

Эти вопросы и ответы также могут быть полезны:

5
03.08.2020, 20:27

Теги

Похожие вопросы