за допомогою сценарію оболонки, можна сказати, коли це запускається з cron vs run вручну?
ОНОВЛЕННЯ:
запитали, чому я хочу знати. Моїм завданням із хроніки буде ведення журналу, і я хочу мати можливість увійти, якщо хтось виконує його вручну.
за допомогою сценарію оболонки, можна сказати, коли це запускається з cron vs run вручну?
ОНОВЛЕННЯ:
запитали, чому я хочу знати. Моїм завданням із хроніки буде ведення журналу, і я хочу мати можливість увійти, якщо хтось виконує його вручну.
Відповіді:
У часи, що мені потрібно було це зробити, я знаю, що це сценарій, який я ніколи не переспрямую на файл або на трубу. Отже, простий тест - це перевірити, чи stdout (він же дескриптор файлу 1) - це tty (що це не буде з cron). У басі:
if [ -t 1 ]
then
: # running from terminal
else
: # not running from terminal, cron maybe
fi
Знову ж таки, попереджаючи , це тест просто, якщо ваш stdout - це tty. Але працює для моїх простих цілей.
Ви також можете перевірити, що таке ваш батьківський процес. У Linux це може бути так просто, як:
if grep -q cron /proc/$PPID/cmdline &> /dev/null
then
: # running from cron
fi
$PPID
не перевіряється в процесі внуків крона.
./myscript > output
буде виявлено як "не tty", і навіть ./myscript | cat
. Тож це насправді не перевіряється на cron / not cron ...
Ви можете визначити унікальну змінну середовища у вашому 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=
. Це, звичайно, підлягає.
Однак це не обов'язково є хорошою ідеєю (наприклад, ви не зможете легко протестувати свої завдання в галузі вручну). Можливо, якщо ви поясните, чому ви цього хочете, хтось може запропонувати краще рішення.
ps
на Linux фактично snoops / proc / anyway.
ps
фрагмент працює у будь-якій системі POSIX. Якщо ви орієнтуєтесь лише на Linux, то користування /proc
дійсно трохи простіше.
Ви можете створити спеціального користувача для роботи під cron. Потім зробіть свій сценарій читабельним лише для цього користувача та вставте його в crontab користувача. Таким чином, жоден інший користувач навіть не може прочитати сценарій, не кажучи вже про його виконання.
До речі, для безпечного рішення вам потрібно зробити скрипт cron у будь-якому разі нечитабельним. Якщо інші користувачі можуть прочитати скрипт, вони можуть скопіювати його, видалити будь-який механізм перевірки кронів, а потім запустити його, обійшовши ваш журнал, якщо вони хочуть.