2015-10-26 20 views
5

Czy można zidentyfikować, czy skrypt powłoki Linux jest wykonywany przez użytkownika lub cronjob?Jak sprawdzić, czy skrypt powłoki Linux jest wykonywany przez cronjob?

Jeśli tak, w jaki sposób mogę zidentyfikować/sprawdzić, czy skrypt powłoki jest wykonywany przez cronjob?

Chcę zaimplementować funkcję w moim skrypcie, która zwraca inne wiadomości tak, jakby była wykonywana przez użytkownika. Na przykład:

if [[ "$type" == "cron" ]]; then 
     echo "This was executed by a cronjob. It's an automated task."; 
    else 
     USERNAME="$(whoami)" 
     echo "This was executed by a user. Hi ${USERNAME}, how are you?"; 
    fi 
+0

Użyj zmiennych środowiskowych? '* * * * * CRON_FIRED = true/path/to/myscript' ale zauważ, że składnia jest [zależna od implementacji crona] (http://stackoverflow.com/a/10657111/2908724) i może być również oszukiwana trywialnie . – bishop

Odpowiedz

6

Jedną z opcji jest sprawdzenie, czy skrypt jest dołączony do tty.

#!/bin/sh 

if [ -t 0 ]; then 
    echo "I'm on a TTY, this is interactive." 
else 
    logger "My output may get emailed, or may not. Let's log things instead." 
fi 

Należy pamiętać, że miejsca pracy są wystrzeliwane przez at(1) również uruchomić bez tty, choć nie specjalnie przez cron.

Należy również zauważyć, że jest to specyfikacja POSIX, a nie Linux- (lub bash-).

+0

Thx, wydaje się być rozwiązaniem. Zawsze zapominam, gdzie mogę znaleźć listę dostępnych parametrów testowych "jeśli", takich jak -n, -x, -f, a także używanego -t. Gdzie mogę znaleźć tę listę? Chcę przeczytać, co dokładnie oznacza "-t". POSIX oznacza, że ​​działa na każdej dystrybucji Linuksa, prawda? – user2966991

+1

@ user2966991 to http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html lub 'man 1p test' –

+1

@ user2966991 W tym przypadku POSIX oznacza, że ​​powinien działać z każdą powłoką zgodną z POSIX. Takie powłoki można również znaleźć w systemie Windows, i technicznie, możesz mieć dystrybucję Linuksa bez powłoki POSIX. –