Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Obecná podpora => Téma založeno: PK69 06 Prosince 2008, 13:33:42
-
Zdravím,
postavil jsem si domácí server, který má běžet jen když má komu sloužit. Zapíná se magickým paketem a vypnout by se měl v okamžiku, kdy není připojen žádný klient, a to je právě ten problém.
Mám updatovaný Ubuntu server 8.04, a protože teprve začínám, používám sudo.
Napsal jsem si jednoduchý skript v PHP, který opingá dané IP adresy a když jsou všechny mrtvé, vypne PC.
<?php
$HostsAddr = array(
"192.168.68.1",
"192.168.68.2",
"192.168.68.3"
);
foreach ($HostsAddr as $Addr) {
# echo "$Addr\n";
exec("ping -c2 $Addr", $output, $retval);
if ($retval == 0){
# echo "někdo běží";
return;
}
}
#echo "všichni jsou vypnuti";
exec("halt", $output, $retval)
?>
V terminálu skript funguje dle očekávání.
Další vize byla přidat ho do Cronu, kde by se spouštěl každých 5 minut. Protože jsem líná lama použil jsem Webmin 1.430 a úlohu spouštěnou jako root jsem bez problémů přidal.
Když z Webadminu vyvolám ručně spuštění úlohy, proběhne opět vše bez problémů dle očekávání.
A teď problém:
Cron úlohu spouští (alespoň podle logu to tak vypadá) v logu od Cronu ani v žádném jiném není chyba a přesto úloha neproběhně korektně, protože nedojde k vypnutí PC
Tuším, že pes bude zakopán někde v právech root versus sudo, ale nevím jak dál, protože s linuxem teprve začínám...
Jak zjistím, že root má právo k vypnutí počítače příkazem halt, když používám sudo?
A neměl by být v nějakém logu chybový zápis, pokud root to právo nemá?
Poradí prosím někdo?
Děkuji
Pavel
-
Zkusil bych to tam hodit manualne:
Aktivujte si roota:
sudo passwd root
heslo
heslo
Prihlasime se za roota:
su -
Zkontrolujem crontaby pro roota a pro uzivatele:
crontab -l #pro roota
crontab -l -u uzivatel #pro uzivatele
Je v nejakem crontabu neco? Pripadne co?
Pokud ne, tak rucne editujem:
crontab -e
Pridame neco takove:
#########################
#m h dom mon dow command
*/5 * * * * /cesta/ke/skriptu.php
##################
Podrobnosti o editaci crontabu:
http://www.root.cz/clanky/hratky-z-radky-na-neznamem-stroji-a-hratky-s-casem/ (http://www.root.cz/clanky/hratky-z-radky-na-neznamem-stroji-a-hratky-s-casem/)
Nezapomente zkontrolovat jestli je skript spustitelny a nevim jak se maji presne volat php skripty z prikazove radky...
-
Osobně jsem docela dlouho úspěšně provozoval toto řešení:
http://forum.ubuntu.cz/index.php/topic,6726.msg51299.html#msg51299
Zdá se mi to lepší než v PHP.
-
Díky za tip, když se přihlásím jako root mám v crontabu toto:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * php /home/DAA.php #Vypne PCCož je asi dobře, ne?
Když spustím jako root
php /home/DAA.phpproběhne opět vše OK
Dál nevím..
Zatím díky Pavel
-
Problém nemám se skriptem (vaše řešení je určitě obecnější, ale já má připojeny prakticky pořád 4 stanice a pravděpodobnost současného restartu všech najednou je dost malá, navíc po restartu okamžitě posílají kouzelný paket).
Problém mám se spouštěním skriptu z cronu
Ale i tak děkuji
Pavel
Osobně jsem docela dlouho úspěšně provozoval toto řešení:
http://forum.ubuntu.cz/index.php/topic,6726.msg51299.html#msg51299
Zdá se mi to lepší než v PHP.
-
Zkuste misto tech 0,5,10,15,... dat */5 i kdyz asi je to to same. Kouknete se do /var/log/syslog neco tam musi bejt. Pokud ne tak crontab nebezi. Coz by bylo divne.
-
a nainstalovat apache, spouštět ho jako root a poté příkaz volat jako "wget http://localhost/vypnout.php" ?
-
Mně to v pohodě jde.... zkusil jsem to dát do cronu... akorát mi to psalo, že nezná příkaz halt. Tak jsem to nahradil:
shutdown -h now
-
Díky všem za odpovědi, zase jsem o kousek dál, ale problém trvá.
Aktuální stav:
1) v žádném logu opravdu nic nebylo, protože cron mi posílal chybová hlášení mailem. Jsem lama, tak se mi nesmějte...
2) chybové hlášení zní:
sh: halt: not found
Zkoušel jsem ho dle pokynů výše nahradit za shutdown, ale výsledek byl stejný, tedy
sh: shutdown: not found
Dávku z cronu spouštím jako root, můj uživatelský účet (pod kterým halt/shutdown funguje) i root používají stejný shell (bash).
Takže momentálně vítězná otázka zní?
??? Jak zpřístupním příkaz halt (shutdown) pro účet root?
Možná je taky podvarianta, jak přinutit cron, aby používal místo sh bash, tedy pokud to chápu správně a cron používá jako shell sh (viz chybové hlášení).
Díky za jakékoliv info
Pavel
-
Systé, -> Správa -> Uživatelé a skupiny -> Poklikáš na roota a v záložce Pokročilé je to k nastavení
-
Děkuji,
ale je to server, žádné klikací rozhraní tam nemám a ani nechci.
Ve Webminu jsem žádné pokročilé nastavení uživatelských účtů nenašel, mám jenom System > Users And Groups
a když rozbalím roota je tam jen Show Logins a Read Email, žádné Advanced apod.
Takže bych ocenil nasměrování na konkrétní konfigurační soubor.
Pavel
-
napiste do toho skriptu celou cestu (absolutni) k programu halt resp. shutdown
-
proc to vsichni tak komplikujete ..??
pokud bude skript v /etc/cron*, tak pobezi by-default s rootovskejma pravama ..
-
/etc/passwd
-
napiste do toho skriptu celou cestu (absolutni) k programu halt resp. shutdown
Takze/sbin/shutdown -h now
-
BOMBA, konečně to funguje dle očekávání ;D ;D ;D
Stačilo dát do skriptu onu plnou cestu.
Prostě mě nenapadlo, že jako řadový uživatel mám nastaveno prohledávání (v DOSu to bylo PATH, co je to v Linuxu nevím) jinak (a z mého pohledu lépe) než božský root...
Děkuji všem co mi pomohli!
Pavel
-
Rekl bych, ze to bude spis pouzitym shelem... Nech si vypsat cestu v bashi pro roota a uvidis, ze tam bude i ta pro shutdown.
echo $PATHJak je to v sh netusim.
-
Hmm ty proměné PATH jsou prakticky identické a cesta k HALTu /sbin/ tam pro roota fakt je.
pavel@brumla:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
root@brumla:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Divné.
Ale hlavně, že to už chodí!
Pavel
-
No, ona ta PATH, co mas v terminalu, ale neni ta path, kterou pouziva cron. Zkus si dat do cronu nasledujici prikaz
echo "$SHELL $PATH" > /tmp/path.txta uvidis, co ti v /tmp/path.txt vyleze :-D
respektive viz man crontab, kde se rika:
The default PATH for user cron jobs is /usr/bin; while root cron jobs default to /usr/sbin:/usr/bin. The default PATH can be set in /etc/default/cron.
-
Díky za vysvětlení,
zase jsem o něco chytřejší.
Pavel
-
Zdravím všechny,
co mi před léty pomohli a prosím znovu o pomoc.
Popsané řešení fungovalo k naprosté spokojenosti několik let, než někdy minulý týden proběhla aktualizace asi 9 balíčků (byl mezi nimi i php-cli, kterého podezřívám nejvíc), výsledkem je, chybové hlášení:
sh: /ping: not found
sh: /halt: not found
aktuální podoba skriptu je:
<?php
$HostsAddr = array(
"192.168.68.1",
"192.168.68.2",
"192.168.68.3"
);
foreach ($HostsAddr as $Addr) {
# echo "$Addr\n";
exec("/bin/ping -c2 $Addr", $output, $retval);
if ($retval == 0){
# echo "někdo běží";
return;
}
}
#echo "všichni jsou vypnuti";
exec("/sbin/halt", $output, $retval)
?>
Všechny cesty jsou abolutní a ping i halt na nich skutečně jsou (ověřeno přes whereis).
Z terminálu funguje ping i halt úplně normálně (ověřeno pod mým účtem i pod rootem).
Chybu vyhazuje primárně cron, ale dá se reprodukovat i prostým voláním skriptu, např.:
php DAA.php
Opět zkoušeno pod mým účtem i pod rootem.
Typuji, že interpretr PHP spouští příkaz exec ještě pod nějakým jiným (třetím) účtem, jenže nevím jak to zjistit.
Pomůže mi prosím někdo?
Předem děkuji
Pavel
-
Zdravím,
výše uvedený problém vyřešen, snad tím pomůžu ostatním lamám...
Problém jsem si způsobil sám, protože jsem testoval nějakou webovou aplikaci, která tvrdě vyžadovala v PHP ZAPNUTÍ Safe Mode.
A to byl kámen úrazu - omylem jsem upravil php.ini pro CLI a nikoliv pro Apache (na chybu jsem vzápětí přišel a upravil i správný soubor, ale z lenosti jsem php.ini pro CLI už nechal být..).
A to je celé. Pointa je v tom, že php příkaz exec NEFUNGUJE, při zapnutém Safe Mode, viz manuál k PHP.
Stačilo v php.ini pro CLI Safe Mode vypnout a vše funguje krásně jako dřív...
Mějte se a nebuďte líní jako já
Pavel