|
[ mr. ako @ 20.10.2012. 03:12 ] @
| Kada scripta ide bez screen opcije sve radi kako treba,
#!/bin/bash
# check SERVER
ps -ef | grep -v grep | grep SERVER.jar
# if not found - equals to 1, start it
if [ $? -eq 1 ]
# only if ,,screen -dmS SERVER -t SERVER,,
then
java -jar SERVER.jar
else
echo "eq 0 - SERVER found - do nothing"
fi
ali kad je sa screenom onda nece.
#!/bin/bash
# check SERVER
ps -ef | grep -v grep | grep SERVER.jar
# if not found - equals to 1, start it
if [ $? -eq 1 ]
# only if ,,screen -dmS SERVER -t SERVER,,
then
screen -d -m SERVER -c java -jar SERVER.jar
else
echo "eq 0 - SERVER found - do nothing"
fi
Pretpostavljam da to ne moze bas tako kako sam ja zamislio :) pa me interesuje da li imate neki predlog? Cron pokrece skriptu -> skripta proverava da li je proces SERVER.jar ziv -> ako nije, skripta pokrece SERVER.jar ali sa screen opcijom po imenu SERVER.
Tj. hocu da se prvo attachuje screen koji je vec rucno pokrenut sa "screen -dmS SERVER -t SERVER", a zatim da pokrene SERVER.jar
U crontab sam stavio ovo ispod, tako da bi on pokretao skriptu svakih 5min.
Code:
00 * * * * user ./script.sh
05 * * * * user ./script.sh
10 * * * * user ./script.sh
15 * * * * user ./script.sh
20 * * * * user ./script.sh
25 * * * * user ./script.sh
30 * * * * user ./script.sh
35 * * * * user ./script.sh
40 * * * * user ./script.sh
45 * * * * user ./script.sh
50 * * * * user ./script.sh
55 * * * * user ./script.sh
|
[ Tyler Durden @ 20.10.2012. 08:38 ] @
prvo, ovaj crontab ti je uzasan. stavi liniju
Code: */5 * * * * user skript
umjesto one gomile sto si stavio.
sto se tice screen-a ne mogu sad da provjerim, ali probaj da navedes punu putanju do java binary...
[ mr. ako @ 20.10.2012. 17:32 ] @
Hahha, znao sam da postoji jednostavniji nacin za taj 5min cronjob, ono je bilo suvise rogobatno... :D
Sto se tice putanje java fajla ona nije potrebna, jer radi tako kako jeste u prvom slucaju bez screen-a.
[ Jbyn4e @ 20.10.2012. 18:47 ] @
^^
Što ne znači da radi i kad se pokrene preko screen-a. Poslušaj čoveka kad ti priča i probaj (imao sam slučaj da radi iz shell-a a neće iz cron-a npr, i problem je bio baš putanja...)
[ Tyler Durden @ 20.10.2012. 18:59 ] @
i ja sam imao isti slucaj :-)
@mr. ako poslusaj covjeka sta ti prica :-)
[ mr. ako @ 20.10.2012. 23:09 ] @
Hahaha, okej, poslusacu coveka sta mi prica... :D
[ uranium @ 21.10.2012. 01:20 ] @
Mislim da ima nekoliko grešaka u ovom delu:
screen -d -m SERVER -c java -jar SERVER.jar
Verzije screen-a koje koristim imaju sledeće tumačenje switcha -c :
Citat:
-c file
override the default configuration file from "$HOME/.screenrc" to file.
dalje, ispred onog SERVER bi trebalo da stoji -S ( jer je to ime sesije koje želiš da postaviš ) - ovako kako je trenutno, pretpostavljam da se na trenutak napravi screen, koji pokuša da izvrši komandu "SERVER -c java -jar SERVER.jar" koja odmah failuje jer ovo "SERVER" očito nije ime nikakvog programa itd.
Dakle, ispravna verzija bi trebalo da bude:
screen -d -m -S SERVER java -jar SERVER.jar ili u toku testiranja nešto poput:
screen -d -m -S SERVER /bin/bash -c "java -jar SERVER.jar &>/tmp/srv.log"
( da ne bude zabune, ne savetujem čuvanje logova u /tmp/ naravno ;) )
[ mr. ako @ 21.10.2012. 03:35 ] @
To -c ne bi trebalo tu da bude, ostavio sam ga greskom mozda.
Za ovo drugo se nismo razumeli, jer je screen vec kreiran sa dmS flagovima rucno. Naveo sam u prvoj poruci to.
[ uranium @ 21.10.2012. 13:32 ] @
Koliko vidim, problematična ti je bila ova skripta:
#!/bin/bash
# check SERVER
ps -ef | grep -v grep | grep SERVER.jar
# if not found - equals to 1, start it
if [ $? -eq 1 ]
# only if ,,screen -dmS SERVER -t SERVER,,
then
screen -d -m SERVER -c java -jar SERVER.jar
else
echo "eq 0 - SERVER found - do nothing"
fi
i koliko vidim, ukoliko se ne nađe proces koji u komandi/argumentima ima SERVER.jar, onda se pokušava izvršavanje:
screen -d -m SERVER -c java -jar SERVER.jar a to objasnih zašto je pogrešno
Ono što je malo problematično je što pokušavaš da se prvo atačuješ na ručno pokrenut screen ( za to svakako ne možeš da koristiš -d -m ).
Mislim da bi bilo lakše da taj ručno pokrenut screen startuješ u detach modu, tako da čim se okonča proces koji pod njim pokrećeš, da se i on sam zatvori, i onda ona skripta samo napravi novu istoimenu sesiju.
[Ovu poruku je menjao uranium dana 21.10.2012. u 14:50 GMT+1]
[ mr. ako @ 22.10.2012. 04:34 ] @
Da, u pravu si, paste-ovao sam pogresan fajl gde za screen ne treba da bude -d -m, vec -r kako bi se attachovao na vec kreiran screen.
Nego, palo mi na pamet da u samom crontabu attachujem screen i pokrenem skriptu, kad vec nece iz scripte da attacuje screen...
Code: */5 * * * * /usr/bin/screen -r SERVER /home/username/SERVER.sh
Ili da pisem jos jednu skripticu, koja ce da pokrene screen, pa ovu prvu...? :D
...a uvek mi ostaje krajnja opcija da ako ne bude hteo da se reattachuje na postojeci screen, kreira novi sa -dmS SERVERxyz. :/ Probacu par tih varijanti posle podne, ako budem imao vremena i pristup serveru.
[ mr. ako @ 22.10.2012. 18:39 ] @
Sto se tice onoga sto sam hteo u crontab-u:
Ovo ne radi, nece da se re-attachuje na vec postojeci.
Code: */5 * * * * screen -r SERVERscn ./script.sh
Dok ovo radi, jer napravi novi screen... ALI...
Code: */5 * * * * screen -dms SERVERscn ./script.sh ...ne prikazuje text na ekranu, vec je screen crn ali funkcionalan i prima komande.
Sto se tice skripte:
Ovo isto ne radi, jer nece re-attach.
#!/bin/bash
# check SERVER
ps -ef | grep -v grep | grep SERVER.jar
# if not found - equals to 1, start it
if [ $? -eq 1 ]
then
screen -r SERVERscn java -jar SERVER.jar
else
echo "eq 0 - SERVER found - do nothing"
fi
Dok, ovo radi, jer napravi novi screen... ALI...
#!/bin/bash
# check SERVER
ps -ef | grep -v grep | grep SERVER.jar
# if not found - equals to 1, start it
if [ $? -eq 1 ]
then
screen -dmS SERVERscn java -jar SERVER.jar
else
echo "eq 0 - SERVER found - do nothing"
fi
...sve normalno radi i prikazuje text na ekranu (za razliku od tog istog uradjenog preko cron-a).
Zakljucak, i dalje ne znam kako da, preko crona i scripte, re-attachujem na vec kreiran screen i zatim pokrenem skriptu u tom screenu. :)
@Tyler Durden
Poslusao sam coveka, i isto se ponasa kad upisem full path i bez njega, ali cu imati u vidu da i to moze biti problem nekad. Thx. :)
[ mr. ako @ 23.10.2012. 21:16 ] @
E sad, posto sam jos-malo-pa odustao od varijante da se reattachujem na vec kreiran screen (a vidim da ni vi nesto nisi zainteresovani previse za problem :D ), odlucio sam da probam kako ce ici sa iznova pozivanim screenom svaki put... i dosao do nekih novih informacija. :)
Kada radim ovako (pokrecem screen iz crontaba):
Code: */5 * * * * screen -dmS SERVERscn ./script.sh java -jar SERVER.jar &>/home/username/SERVER.log
U tom slucaju se desava ono sto sam naveo u prethodnoj poruci da se attachovanjem na taj screen sa screen -r SERVERscn " ...ne prikazuje text na ekranu, vec je screen crn ali funkcionalan i prima komande." I sve informacije normalno loguje u /home/username/SERVER.log
A kada radim ovako (pokrecem screen iz skripte):
Code: */5 * * * * ./script.sh screen -dmS SERVERscn java -jar SERVER.jar &>/home/username/SERVER.log
Onda se, attachovanjem na taj screen sa screen -r SERVERscn text prikazuje na ekranu (i komande su funkcionalne naravno), ALI nista se ne loguje u /home/username/SERVER.log - fajl je prazan.
Sto nagovestava zasto se nista ne prikazuje na ekranu u prvom slucaju i zasto ne loguje nista u durgom slucaju, ali ono sto mene sad interesuje je ZASTO je to tako? :)
Tj. iz kog razloga je ili/ili varijanta? Kako da namestim da ispisuje na ekranu i loguje?
[ uranium @ 23.10.2012. 21:37 ] @
Možeš da isprobaš tee program.
java -jar SERVER.jar 2>&1 | tee /home/username/SERVER.log
Problem koji imaš sa redirekcijom je u tome što kad smestiš redirekciju u skriptu, onda se ona odnosi na komande koje joj prethode,
a kad radiš bez skripte, redirekcija se odnosi na komandu screen koja igrom slučaja nema potrebe da ispiše ništa ni na stderr ni na stdout ( možeš da testiraš ovu hipotezu tako što namerno napraviš neku grešku u sintaksi screen naredbe - poruku o grešci bi trebalo da nađeš u SERVER.log ).
[ mr. ako @ 24.10.2012. 01:36 ] @
Sa tee programom je nesto drugacije...
Kad screen pokrenem iz crontab, radi kako treba - i ispisuje na ekranu i loguje, a kad ga pokrenem iz scripte, onda radi kao i ranije, nece da loguje...
Tako da, screen cu pokretati iz crontab-a, a tebi hvala na ideji za tee. :)
Sto se tice testiranja, kada napravim namernu gresku pri pokretanju screena (recimo pogresan argumnet -zzz) cak i iz scripte, onda to upise log... ali tada nije ni pokrenuo server jer je greska bila jos kod screen naredbe... ali da, hipoteza je ispravna kao sto si i rekao.
EDIT: bitna izmena na pocetku poruke
[Ovu poruku je menjao mr. ako dana 24.10.2012. u 03:01 GMT+1]
[ uranium @ 24.10.2012. 03:01 ] @
Sad tek shvatih da sam onaj tvoj drugi po redu pristup pogrešno oslovio kao da je bez skripte, a zapravo, mislio sam samo na to da li screen kao komandu izvršava skriptu ili prosto shell komandu sa argumentima ...
Možeš da isprobaš i sledeće:
*/5 * * * * screen -dmS SERVERscn ./script.sh
screen -dmS SERVERscn <( java -jar SERVER.jar &>/home/username/SERVER.log )
Poslednjih godina sam prestao da koristim screen za ovakve stvari ...
Dobre alternative su:
1. nohup komanda &> neki.log
2. ( komanda <&- &> neki.log & ) &
A log uvek možeš da pratiš sa tail -f neki.log
[ mr. ako @ 24.10.2012. 03:49 ] @
Nisam sigran sta postizem sa ovim sto predlazes da testiram kao ni sta onim 2. predlogom.
Sto se tice screen-a meni on odlicno zavrsava posao, ali evo u ovom slucaju ne ide tacno kako sam zamislio, vec moram da pravim workaround i kompromise... Nohup mi ne odgovara nikako, a tail koristim gde ima potrebe i smisla.
E da, zaboravio sam da pitam u vezi ovoga &>/home/username/SERVER.log i 2>&1 | tee /home/username/SERVER.log kako bih mogao da namestim da svaki put kreira novi fajl po moguctsvu sa datumom na taj dan kada je kreiran?
Vidim da tee ima argument -a kojim nastavlja postojeci fajl, no da li postoji nacin za kreiranje novog fajla svaki put?
[ uranium @ 24.10.2012. 09:34 ] @
Ono prvo samo demonstrira kako se može pravilno grupisati redirekcija tako da se odnosi na komandu a ne na sam screen ( bez pravljenja skripte ).
Za datum možeš da probaš nešto poput:
&>/home/username/SERVER.$( date +%F ).log
2>&1 | tee /home/username/SERVER.$( date +%F ).log
[ mr. ako @ 25.10.2012. 17:22 ] @
Odlicno, to je ono sto mi je trebalo. :) Dodao sam u scriptu ovako da bi bilo preciznije i filename-friendly na Win. :)
2>&1 | tee /home/username/logfilename-$( date +%F-%H-%M-%S ).log
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|