за допомогою сценарію оболонки, можна сказати, коли це запускається з cron vs run вручну?


5

за допомогою сценарію оболонки, можна сказати, коли це запускається з cron vs run вручну?

ОНОВЛЕННЯ:

запитали, чому я хочу знати. Моїм завданням із хроніки буде ведення журналу, і я хочу мати можливість увійти, якщо хтось виконує його вручну.


У мене була однакова потреба, і першим результатом пошуку було це питання. Я з інтернетів (та обміну стеками).
Девід Дж. Лішевський

Відповіді:


8

У часи, що мені потрібно було це зробити, я знаю, що це сценарій, який я ніколи не переспрямую на файл або на трубу. Отже, простий тест - це перевірити, чи 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

я все ще повинен підтвердити, але здається досить твердим поки що. якщо працює, я позначу як відповідь
Roy Rico

Більш розумний і рідніший, ніж мінлива відповідь мій оточення. Будьте уважні, що використання $PPIDне перевіряється в процесі внуків крона.
Doug Harris

1
Гм, це також не вдасться, якщо вихід буде перенаправлений (так як тоді stdout не є tty). Так просто ./myscript > outputбуде виявлено як "не tty", і навіть ./myscript | cat . Тож це насправді не перевіряється на cron / not cron ...
sleske

1
Щойно FYI, легко перемогти другу перевірку, обернувши програму сценарієм під назвою "cron".
Slartibartfast

Це чудово підходить для того, для чого я маю намір його використовувати.
Рой Ріко

5

Ви можете визначити унікальну змінну середовища у вашому 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:

1

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

Однак це не обов'язково є хорошою ідеєю (наприклад, ви не зможете легко протестувати свої завдання в галузі вручну). Можливо, якщо ви поясните, чому ви цього хочете, хтось може запропонувати краще рішення.


Це спрацювало б. Трохи простіше з моїм фрагментом коду, перевіряючи / proc / $ PPID / cmdline. psна Linux фактично snoops / proc / anyway.
Багата Гомолка

@RichHomolka Мій psфрагмент працює у будь-якій системі POSIX. Якщо ви орієнтуєтесь лише на Linux, то користування /procдійсно трохи простіше.
Жиль

0

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

До речі, для безпечного рішення вам потрібно зробити скрипт cron у будь-якому разі нечитабельним. Якщо інші користувачі можуть прочитати скрипт, вони можуть скопіювати його, видалити будь-який механізм перевірки кронів, а потім запустити його, обійшовши ваш журнал, якщо вони хочуть.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.