2012-05-09 10 views
130

znalazłem ten kawałek kodu w /etc/cron.daily/apfCo to jest/dev/null 2> & 1?

#!/bin/bash 
/etc/apf/apf -f >> /dev/null 2>&1 
/etc/apf/apf -s >> /dev/null 2>&1 

To zaczerwienienie i przeładunku zaporę.
Nie rozumiem części >> /dev/null 2>&1.

Jaki jest cel posiadania tego w cron? Zastępuje moje reguły firewalla. Czy mogę bezpiecznie usunąć tę pracę cron?

+1

FYI: A krótszą drogę wyciszanie proces jest '> & - 2> & - '. – Zaz

+10

@ Jos: dlaczego sprawiają, że rzeczy są jeszcze bardziej zagadkowe, niż są już? – endolith

+2

@Josh To zamyka odpowiednie FD, co może spowodować przerwanie programów. – glglgl

Odpowiedz

221

>> /dev/null przekierowuje standardowe wyjście (stdout) na /dev/null, które to odrzuca.

(The >> wydaje rodzaju zbędne, ponieważ >> środki dołączyć podczas > środki obciąć i pisać, albo dodanie lub pisząc do /dev/null ma taki sam efekt netto. I zazwyczaj wystarczy użyć > z tego powodu).

2>&1 przekierowuje standardowy błąd (2) na standardowe wyjście (1), które następnie odrzuca je, ponieważ standardowe wyjście zostało już przekierowane.

+0

Co oznacza symbol '&' w tym miejscu '2> & 1'. – Nobody

+0

i wskazuje deskryptor pliku. Zwykle istnieją 3 deskryptory plików - standardowe wejście, wyjście i błąd. – Testing123

+0

@ Nikt nie sprawdza poniżej mojej odpowiedzi na pytanie https://stackoverflow.com/questions/10508843/what-is-dev-null-21/42919998?noredirect=1#answer-42919998 – Vishrant

47

Jest to sposób cichego wykonania programu i ukrycia całego jego wyjścia.

/dev/null to specjalny obiekt systemu plików, który wyrzuca wszystko zapisane w nim. Przekierowanie strumienia do niego oznacza ukrycie wyjścia.

Część 2>&1 oznacza "przekierować zarówno strumień wyjściowy, jak i strumień błędów". Nawet jeśli Twój program zapisuje do stderr, dane wyjściowe nie będą wyświetlane.

+26

W rzeczywistości '2> i 1' faktycznie przekierowuje' stderr' na 'stdout'. Różnica między tym a tym, co twierdzisz, najlepiej ilustruje zamienienie kolejności przekierowań, np. '2> & 1>/dev/null'. – zigg

0

Jak opisano w innych, pisanie do/dev/null eliminuje wyjście programu. Zwykle cron wysyła wiadomość e-mail dla każdego wyjścia z procesu rozpoczętego przez cronjob. Więc pisząc dane wyjściowe do/dev/null, uniemożliwiasz wysyłanie spamu, jeśli podałeś swój adres w cron.

0

Edytuj . Ustaw DEVEL_MODE="0". DEVEL_MODE ustawiona na 1 doda zadanie crona, aby zatrzymać apf po 5 minutach.

3

Używam >> /dev/null 2>&1 do cichego robienia cronów, cronjob wykona zadanie, ale nie wyśle ​​raportu na mój e-mail.

Z tego co wiem, nie usuwać /dev/null, jest to przydatne szczególnie podczas korzystania z cpanel, może być używany do raportu Cronjob rzucania.

12

/dev/null - standardowy plik, który odrzuca wszystko, co do niego napiszesz, ale zgłasza , że operacja zapisu zakończyła się pomyślnie. 1 to stdout, a 2 to stderr. 2>&1 przekierowuje stderr na stdout. &1 oznacza deskryptor pliku (stdout), w przeciwnym razie (jeśli używasz tylko 1) przekierujesz stderr do pliku o nazwie 1. [any command] >>/dev/null 2>&1 przekierowuje wszystkie stderr na stdout i zapisuje to wszystko na /dev/null.

31

Pozwala podzielić oświadczenie >> /dev/null 2>&1 na części:


Część 1:>> wyjście przekierowania

ta służy do przekierowywania wyjścia programu i załącza wyjście na końcu pliku. More...


Część 2:/dev/null specjalny plik

To Pseudo-devices special file.

poleceń ls -l /dev/null daje szczegóły tego pliku:

crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null 

Czy obserwowany crw? Co oznacza, że ​​jest to plik pseudo-urządzenia, który jest typu character-special-file, który zapewnia dostęp szeregowy.

/dev/null accepts and discards all input; produces no output (always returns an end-of-file indication on a read). Reference: Wikipedia


Część 3:2>&1 plik deskryptora

Gdy wykonuje program domyślnie system operacyjny open trzy pliki STDIN, STDOUT i STDERR jak wiemy, gdy plik jest otwarty system zwraca małą liczbę całkowitą nazwaną jako deskryptor pliku . Deskryptor pliku dla tych plików wynosi odpowiednio 0, 1, 2.

Więc 2>&1 mówi po prostu przekierować STDERR do STDOUT

& means whatever follows is a file descriptor, not a filename.

W skrócie, za pomocą tego polecenia mówisz swój program, by nie krzyknąć podczas wykonywania.

Jakie jest znaczenie wykorzystania 2>&1?

Jeśli nie chcesz produkować żadnych wyników, nawet w przypadku błędu w terminalu. Aby wyjaśnić Weźmy następujący przykład:

$ ls -l > /dev/null 

Na powyższym poleceniu nie ma wyjścia został wydrukowany w terminalu, ale co jeśli to polecenie powoduje błąd:

$ ls -l file_doesnot_exists > /dev/null 
ls: cannot access file_doesnot_exists: No such file or directory 

chociaż jestem przekierowanie wyjścia do /dev/null to jest drukowane na terminalu.To dlatego, że nie są przekierowanie wyjścia błędzie /dev/null tak, aby przekierować wyjście błędów, jak również jest to wymagane, aby dodać 2>&1

$ ls -l file_doesnot_exists > /dev/null 2>&1 
+1

Dobry przykład! Nie wiem ">" nie przekieruje wcześniej "STDERR". –