Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Obecná podpora => Téma založeno: PK69 06 Prosince 2008, 13:33:42

Název: Vypnutí PC pomocí úlohy v Cronu [problém po aktualizaci]
Přispěvatel: 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.

Kód: [Vybrat]
<?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
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: truhlik 07 Prosince 2008, 10:42:37
Zkusil bych to tam hodit manualne:

Aktivujte si roota:
Kód: [Vybrat]
sudo passwd root
heslo
heslo
Prihlasime se za roota:
Kód: [Vybrat]
su -
Zkontrolujem crontaby pro roota a pro uzivatele:
Kód: [Vybrat]
crontab -l #pro roota
crontab -l -u uzivatel #pro uzivatele

Je v nejakem crontabu neco? Pripadne co?

Pokud ne, tak rucne editujem:
Kód: [Vybrat]
crontab -e
Pridame neco takove:
Kód: [Vybrat]
#########################
#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...
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: Tomáš Pikálek 07 Prosince 2008, 12:06:52
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.
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: PK69 07 Prosince 2008, 14:11:28
Díky za tip, když se přihlásím jako root mám v crontabu toto:
Kód: [Vybrat]
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
Kód: [Vybrat]
php /home/DAA.phpproběhne opět vše OK

Dál nevím..

Zatím díky Pavel
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: PK69 07 Prosince 2008, 14:15:37
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.
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: truhlik 07 Prosince 2008, 15:17:52
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.
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: soudruh 07 Prosince 2008, 15:19:21
a nainstalovat apache, spouštět ho jako root a poté příkaz volat jako "wget http://localhost/vypnout.php" ?
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: Martin - ViPEr*CZ* 07 Prosince 2008, 15:34:01
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
Název: Posun v problému
Přispěvatel: PK69 11 Prosince 2008, 09:08:01
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í:
Kód: [Vybrat]
sh: halt: not found
Zkoušel jsem ho dle pokynů výše nahradit za shutdown, ale výsledek byl stejný, tedy
Kód: [Vybrat]
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

Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: soudruh 11 Prosince 2008, 15:40:34
Systé, -> Správa -> Uživatelé a skupiny -> Poklikáš na roota a v záložce Pokročilé je to k nastavení
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: PK69 11 Prosince 2008, 16:00:17
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
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: kkaarreell 11 Prosince 2008, 16:18:30
napiste do toho skriptu celou cestu (absolutni) k programu halt resp. shutdown
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: nettezzaumana 11 Prosince 2008, 16:22:19
proc to vsichni tak komplikujete ..??

pokud bude skript v /etc/cron*, tak pobezi by-default s rootovskejma pravama ..
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: soudruh 11 Prosince 2008, 17:20:24
/etc/passwd
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: truhlik 11 Prosince 2008, 17:46:02
napiste do toho skriptu celou cestu (absolutni) k programu halt resp. shutdown

Takze
Kód: [Vybrat]
/sbin/shutdown -h now
Název: Re: Vypnutí PC pomocí úlohy v Cronu - VYŘEŠENO
Přispěvatel: PK69 11 Prosince 2008, 19:38:59
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
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: truhlik 12 Prosince 2008, 00:20:34
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.
Kód: [Vybrat]
echo $PATHJak je to v sh netusim.
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: PK69 12 Prosince 2008, 00:34:34
Hmm ty proměné PATH jsou prakticky identické a cesta k HALTu /sbin/ tam pro roota fakt je.

Kód: [Vybrat]
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
Název: Re: Vypnutí PC pomocí úlohy v Cronu
Přispěvatel: kkaarreell 12 Prosince 2008, 12:35:13
No, ona ta PATH, co mas v terminalu, ale neni ta path, kterou pouziva cron. Zkus si dat do cronu nasledujici prikaz
Kód: [Vybrat]
echo "$SHELL $PATH" > /tmp/path.txta uvidis, co ti v /tmp/path.txt vyleze :-D

respektive viz man crontab, kde se rika:
Citace
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.
Název: Re: Vypnutí PC pomocí úlohy v Cronu [vyřešeno]
Přispěvatel: PK69 12 Prosince 2008, 14:25:01
Díky za vysvětlení,
zase jsem o něco chytřejší.

Pavel
Název: Stejný problém je tu zpět
Přispěvatel: PK69 07 Května 2011, 14:50:49
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í:

Kód: [Vybrat]
sh: /ping: not found
sh: /halt: not found

aktuální podoba skriptu je:
Kód: [Vybrat]
<?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ř.:

Kód: [Vybrat]
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



Název: Re: Vypnutí PC pomocí úlohy v Cronu [problém po aktualizaci][VYŘEŠENO]
Přispěvatel: PK69 26 Června 2011, 21:04:56
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