[ 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