С помощью сценария оболочки, можно сказать, когда он запускается с Cron против запуска вручную?

С помощью сценария оболочки, можно сказать, когда он запускается с Cron против запуска вручную?

ОБНОВИТЬ:

был задан вопрос, почему я хочу знать. Моя задача cron будет входить в систему, и я хочу иметь возможность войти, если кто-то выполняет ее вручную.

4 ответа

Решение

В те времена, когда мне нужно было это делать, я знаю, что это скрипт, который я никогда не перенаправлю в файл или канал. Таким образом, простой тест состоит в том, чтобы проверить, является ли stdout (он же дескриптор файла 1) tty (чего не будет от cron). В Баш:

if [ -t 1 ]
then
    : # running from terminal
else
    : # not running from terminal, cron maybe
fi

Опять же, предупреждение, это тест, просто если ваш стандартный вывод tty. Но работает для моих простых целей.

Вы также можете проверить, каков ваш родительский процесс. В Linux это может быть так просто:

if grep -q cron /proc/$PPID/cmdline &> /dev/null
then
    : # running from cron
fi

Вы можете определить уникальную переменную окружения в вашем crontab:

RUNNINGFROMCRON=1

16 18 * * *     /usr/local/bin/crontest

Я проверил с этим сценарием:

#! /bin/bash

echo " running script "

echo -n "testing for var: "
echo $RUNNINGFROMCRON

Когда я бежал от cron вывод был:

running script 
testing for var: 1

Когда я запускался из командной строки вручную, вывод был:

running script 
testing for var:

Вы можете проверить имя родительского процесса, который можно получить с помощью ps -p $PPID -o comm=, Это подделка, конечно.

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

Вы можете создать специального пользователя для запуска задания cron. Затем сделайте ваш скрипт доступным для чтения только для этого пользователя и поместите его в crontab пользователя. Таким образом, никакой другой пользователь не сможет даже прочитать скрипт, не говоря уже о его выполнении.

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

Другие вопросы по тегам