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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2008-09-09 08:33:31

  grzegorz.85 - Członek DUG

grzegorz.85
Członek DUG
Skąd: Ostrołęka
Zarejestrowany: 2007-07-12
Serwis

Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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:

Kod:

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

 

#2  2008-09-09 09:22:41

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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


Pozdrawiam, Tomek

Offline

 

#3  2008-09-09 09:26:49

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#4  2008-09-09 09:33:38

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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)


Pozdrawiam, Tomek

Offline

 

#5  2008-09-09 09:54:04

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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.


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#6  2008-09-09 10:05:25

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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ć :>)


Pozdrawiam, Tomek

Offline

 

#7  2008-09-09 12:12:15

  grzegorz.85 - Członek DUG

grzegorz.85
Członek DUG
Skąd: Ostrołęka
Zarejestrowany: 2007-07-12
Serwis

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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ąć:

Kod:

if not pgrep nazwa_skryptu &>  /dev/null; then
    ./nazwa_skryptu
fi

Kombinowałem z nawiasami, apostrofami bezskutecznie.

Offline

 

#8  2008-09-09 12:18:23

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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$

Kod:

AM=$( pgrep -c ^python$ )
[ $AM -lt 1 ] && echo "Uruchamiam"

Pozdrawiam, Tomek

Offline

 

#9  2008-09-09 12:29:20

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#10  2008-09-09 13:05:56

  grzegorz.85 - Członek DUG

grzegorz.85
Członek DUG
Skąd: Ostrołęka
Zarejestrowany: 2007-07-12
Serwis

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

Na szybko wedlug mnie dziala :) Ale czemu użycie not nie zwracalo bledu?

Kod:

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

 

#11  2008-09-09 13:12:57

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

grzegorz.85 napisał(-a):

Kod:

if !( pgrep nazwa_skryptu &> /dev/null ); then
    ./nazwa_skryptu
fi

nawias jest niepotrzebny, po prostu

Kod:

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

Kod:

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:

Kod:

pgrep $PROGRAM >/dev/null 2>&1 && echo "$PROGRAM działa" || echo "$PROGRAM nie działa"

Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#12  2008-09-09 13:17:35

  grzegorz.85 - Członek DUG

grzegorz.85
Członek DUG
Skąd: Ostrołęka
Zarejestrowany: 2007-07-12
Serwis

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

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

 

#13  2008-09-09 13:19:58

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

grzegorz.85 napisał(-a):

Z zabawy z procmailem pamiętam, że ^ oznacza początek, czyżby $ oznaczał koniec?

dokładnie


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#14  2008-09-09 13:46:35

  czadman - Bicycle repairman

czadman
Bicycle repairman
Skąd: Wrocław
Zarejestrowany: 2005-07-08

Re: Sprawdzanie czy procec jest uruchomiony... po raz n-ty

Ja się dorzucę, podstawy, które warto znać - http://www.regular-expressions.info/reference.html .


http://www.debian.org/logos/openlogo-nd-50.png

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)