У Вас есть много опций, включая 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 страницу справочника для деталей того, как выполнить ее.
Насколько я знаю, что нет никакого способа непосредственно сделать это, поскольку крон имеет особое назначение - рабочие команды расписаний в определенное время. Таким образом, лучшая вещь состоит в том, чтобы быть или вручную создать crontab запись или записать сценарий, который удаляет и сбрасывает среду.
Вы можете смоделировать среду пользователя 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
Вы можете принудительно запустить crontab следующей командой:
run-parts /etc/cron.daily
Я нашел решение, которое кажется немного лучше для моих целей (команды, показанные для CentOS / RHEL -похожи, но должны быть адаптированы практически везде ).
Для этого требуется libfaketime
-. Вы можете собрать его самостоятельно из исходного кода по адресуhttps://github.com/wolfcw/libfaketimeили просто использовать один из множества пакетов изhttps://pkgs.org/download/libfaketime.
service crond stop
faketime
инструмента libfaketime. (Он позволяет имитировать системный вызов для поиска времени для любых дочерних процессов ). 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')
Не очень элегантно, но работает :вот что я использую для запуска задания на 5-й строке моего crontab:
eval "$(crontab -l | sed -n '5p' | tr -s ' ' | cut -d' ' -f 6-)"
Он отображает crontab, получает 5-ю строку, заменяет несколько пробелов одним пробелом, берет все, начиная с 6-го столбца до конца, а затем запускает его с помощью eval
.
В 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...
Я цитирую ответ(посмотреть полностью)из сбоя сервера:
Выполнение команд crontab в пакете -:
crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done
для запуска под другим пользователем:
sudo -H -u username bash -c "crontab... "
Если это поможет, после того, как мне пришлось самому отлаживать задания 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"
Ответ Даладима был мне полезен. Он запускает команду немедленно, а не через 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
и подождать минуту, чтобы получить доступ к среде.
Эти вопросы и ответы также могут быть полезны: