Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam wszystkich. Mam skrypcik sprawdzający czy proces jest uruchomiony, i jeżeli nie, to je uruchamia.
Wszystko działa dobrze, z pewnym ale... . Kod skryptu:
if pgrep nazwa_skryptu &> /dev/null; then echo "Duplikacja procesu" else ./nazwa_skryptu fi
Skrypcik ten dodałem do crona. I wszystko byłoby ok, gdyby nie to, że co chwila (gdy cron odpala skrypcik) otrzymuje maila z treścią "Duplikacja procesu". Z pewnością pomogłoby na tę bolączkę wyrzucenie echo i wstawienie jakiegoś sleepa, ale wierzę, że można prościej.
Miałem zamiar odwrócić warunek if, i po nim od razu wrzucić odpalanie skryptu, bez zadnego else, ale nie mam pojęcia na jakiej zasadzie działa ten warunek. Na dobry początek proszę o NIE podawanie mi gotowego rozwiązania. Proszę jedynie o wyjaśnienie co oznacza magiczne &>. Jeżeli to zrozumiem, to zapewne sens zrozumiem.
Offline
Redirecting Standard Output and Standard Error
Bash allows both the standard output (file descriptor 1) and the stan‐
dard error output (file descriptor 2) to be redirected to the file
whose name is the expansion of word with this construct.
There are two formats for redirecting standard output and standard
error:
&>word
and
>&word
Of the two forms, the first is preferred. This is semantically equiva‐
lent to
>word 2>&1
Offline
dodam, że &> jest bashyzmem, jeśli zależy ci na pisaniu "czystych" skryptów powłoki (warto!), należy używać przytoczonego >/dev/null 2>&1
Offline
Ja tam nic złego w "bashizmach" nie widzę. Bash jest praktycznie w każdym Linuksie zainstalowany, w większości jest domyślną powłoką. Dlatego Imo, nie warto :-P
chyba ze komus zalwzy na jakies tam wielkiej kompatybilnosci, bo pisze skrypy dla niepewnego ogółu :P
Ostatnio edytowany przez urug (2008-09-09 09:41:27)
Offline
urug napisał(-a):
Ja tam nic złego w "bashizmach" nie widzę. Bash jest praktycznie w każdym Linuksie zainstalowany, w większości jest domyślną powłoką. Dlatego Imo, nie warto :-P
chyba ze komus zalwzy na jakies tam wielkiej kompatybilnosci, bo pisze skrypy dla niepewnego ogółu :P
GNU/Linux to nie cały świat, oprócz niego jest cała masa innych uniksowych systemów. Nawet jeśli nie pisze się dla "niepewnego ogółu", warto pisać czyste dla siebie — cholera wie na czym przyjdzie pracować (nie tylko w domu) za czas jakiś. A przerabianie skryptów na wyścigi lub — co gorsza — porzucanie starych przyzwyczajeń, to nie jest coś przyjemnego. :)
Po drugie bash sporą kobyłką, w skryptach warto używać np. dasha/asha, które są mniejsze.
Oczywiście są przypadki, w których lepiej z basha skorzystać, ale zdecydowana większość skryptów (np. powyższy) tego nie wymaga.
Offline
Ja wiem żę jutro i za 5 lat też - będę używał basha. Lubię basha, dlaczego miałbym rezygnować z jego dobrodziejstw dla kompatybilnośi, która w ogóle nie jest mi potrzebna?
Zresztą, prawdę mówiąc - ja nawet już nie wiem co jest bashizmem, a co nie jest :-P
(Bo po co miałbym to wiedzieć :>)
Offline
A wracając do pierwszego postu ;>
W takim razie z tego co rozumiem różnica między &> a > jest taka, że
ten pierwszy przekierowuje dodatkowo Standard Error.
Kombinowałem aby uprościć skrypt, ale nici z tego. Mam nadzieję, że mi pomozecie.
Wyrzeźbiłem takie coś, co niekoniecznie działa, ale chyba przedstawia co chcę osiągnąć:
if not pgrep nazwa_skryptu &> /dev/null; then ./nazwa_skryptu fi
Kombinowałem z nawiasami, apostrofami bezskutecznie.
Offline
Myślę, że błąd tkwi w tym, że pgrep dopasowuje nazwa_skryptu jako fragment, nie szuka procesu o dokładnie takiej nazwie. Powinno pomóc dodanie ^nazwa$
AM=$( pgrep -c ^python$ ) [ $AM -lt 1 ] && echo "Uruchamiam"
Offline
grzegorz.85 napisał(-a):
Kod:
if not pgrep nazwa_skryptu &> /dev/null; then ./nazwa_skryptu fi
znakiem negacji jest wykrzyknik (por. = i !=), tak więc skrypt powinien wyglądać następująco: (zapomniałem, że nie chjcesz gotowego rozwiązania ;])
dodam tylko, że jesteś baaardzo blisko
dopisek: jak już dojdziesz, pokażę jak to zrobić w jednolinijkowcu
Ostatnio edytowany przez azhag (2008-09-09 12:41:16)
Offline
Na szybko wedlug mnie dziala :) Ale czemu użycie not nie zwracalo bledu?
if !( pgrep nazwa_skryptu &> /dev/null ); then ./nazwa_skryptu fi
Jestem w trakcie testowania rozwiązania kolegi urug, ktore tez wydaje sie byc dobre :>
Offline
grzegorz.85 napisał(-a):
Kod:
if !( pgrep nazwa_skryptu &> /dev/null ); then ./nazwa_skryptu fi
nawias jest niepotrzebny, po prostu
if ! pgrep nazwa_skryptu &> /dev/null; then ./nazwa_skryptu fi
A teraz obiecany jednolinijkowiec: użyte tutaj są konstrukcje:
&& — wykonaj gdy sukces
|| — wykonaj gdy błąd
pgrep $PROGRAM >/dev/null 2>&1 && echo "$PROGRAM działa" pgrep $PROGRAM >/dev/null 2>&1 || echo "$PROGRAM nie działa"
można też w sposób kombinowany:
pgrep $PROGRAM >/dev/null 2>&1 && echo "$PROGRAM działa" || echo "$PROGRAM nie działa"
Offline
Jeszcze jakby ktoś wytłumaczył użyczie ^python$ to w 100% wszystko zrozumiem. Z zabawy z procmailem pamiętam, że ^ oznacza początek, czyżby $ oznaczał koniec?
Poki co wisze wam po piwie ;)
Offline
grzegorz.85 napisał(-a):
Z zabawy z procmailem pamiętam, że ^ oznacza początek, czyżby $ oznaczał koniec?
dokładnie
Offline
Ja się dorzucę, podstawy, które warto znać - http://www.regular-expressions.info/reference.html .
Offline
Strony: 1