2012-04-04 11 views
5

Mamy skrypty następujący charakter (w cron)Czy istnieje sposób w skrypcie powłoki, aby dowiedzieć się, gdzie jego wynik jest przekierowywany?

someScript.sh > /tmp/cronlog/somescript.$(date +%Y%m%d).log 2>&1

Teraz istnieje sposób, za pomocą którego zw someScript.sh mogę dowiedzieć się, co złożyć wyjście upadł w celu?

Skrypt wysyła wiadomość e-mail z podsumowaniem. Jednocześnie chciałbym wspomnieć, że szczegóły można znaleźć w tak i tak plik wyjściowy - w wiadomości e-mail.

Jestem świadomy konstrukcji if [ -t 1 ], aby wykryć standardowe wyjście, ale jak uzyskać nazwę pliku wyjściowego? Należy zauważyć, że chcę, aby to było ogólne, aby ktoś mógł zmienić plik wyjściowy w cron, a skrypt nie musi być modyfikowany.

+1

przenieść część email procesu Do skrypt wrapper, który wywołuje 'someScript.sh', sprawdza, czy działa poprawnie, a następnie przesyła odpowiednio przygotowane wiadomości e-mail (sukces, ostrzeżenie lub błąd). ELSE ustaw plik logFile, wyeksportuj go, zamień tmp/... powyżej na $ logFile, polegaj na $ {logFile} wewnątrz skryptu. Powodzenia. – shellter

Odpowiedz

9

Najprostszą rzeczą mogę myśleć, że:

readlink -f /proc/$$/fd/1 

$$ jest PID skryptu (wewnątrz skryptu). W większości systemów uniksowych/proc/[pid] jest pseudokatalog zawierający informacje o procesie [pid].

/proc/[pid]/fd to katalog zawierający listę dowiązań symbolicznych dla otwartych deskryptorów plików procesu. fd/0 to dane wejściowe, fd/1 to dane wyjściowe skryptu itp.

readlink to plik docelowy lub tty, jeśli nie przekierowujesz danych wyjściowych.

Oczywiście, jeśli chcesz go wyświetlić, musisz wyświetlić go gdzieś indziej niż standardowy ouput, lub zostanie przekierowany! Aby debugować, wypróbuj błąd standardowy (2).

różne powołania dać te wyniki na moim komputerze (script.sh po prostu wywołuje readlink -f/proc/$$/fd/1> & 2)

# ./script.sh 
/dev/pts/0 

# ./script.sh > /var/tmp/foo 
/var/tmp/foo 

# ./script.sh | more 
/proc/12132/fd/pipe:[916212] 
+0

Awesome! Akceptuję odpowiedź. @huelbois. Chciałbym, żebyście zdobyli więcej głosów za to. –

+0

Komentuję, ponieważ Linux był tutaj ** NIE ** w tagu. Nie mam '/ proc' na moim Macu. – anubhava

+0

Thanx @ring okaziciel!Nie miał wiele okazji do pracy na Macu, zaledwie 20 dni na bolesny projekt. Niemniej jednak dostajesz bardzo interesujące rzeczy z/proc pseudo-systemu plików, warto go obejrzeć. – huelbois

4

Zamiast próbować znaleźć hack (i to zależy od platformy), lepiej jest przyjąć tutaj nieco inne podejście.

Ustaw crona tak:

someScript.sh /tmp/cronlog/somescript.$(date +%Y%m%d).log 

czyli bez i > lub 2>&1 (stdout/stderr strumieni przekierowań) i po prostu przekazać argument z żądanym logfile nazwy.

Teraz wewnątrz someScript.sh przekierować strumień do pliku dziennika jak ten:

LOGFILE=$1 
exec &>${LOGFILE} 

I wreszcie można następnie wiadomość, że klienci:

"output details could be found in ${LOGFILE}" 
Powiązane problemy