Hello,
Nem vagyok valami nagy tudasu programozo, inkabb csak "home" szint, de egy szamomra erdekes problemaval talalkoztam, most mar tobb gepen is...
Irtam egy PHP scriptet, ami teljesen egyszeruen shell_exec-el vagy sima exec-el lekeri a szabad lemezteruletet stb..
Szandekosan irtam stb -t, mert mar a veget is kitoroltem a programomnak, csak rogzitem a visszakapott erteket egy fajlba es az alabbi jelenseget tapasztalom:
Ha kezzel futtatom le a scriptet (bash# php progi.php) akkor a program visszaadja a valodi erteket.
Ha crontab-al idozitem a futtatast, akkor a legeslegelso futaskor a valos erteket adja vissza a program, aztan minden tovabbi lefutaskor (es innentol akarhanyszor) a valos ertek ketszerese jon vissza... tehat nem novekmenyesen mindig az elozo ketszerese, hanem a valodi eppen lekert ertek ketszerese.
Koszi a javaslatokat elore is...
- 1166 megtekintés
Hozzászólások
Mi van a kódban?
- A hozzászóláshoz be kell jelentkezni
A kod igy nez ki:
PHPKEZD
clearstatcache();
$file = "valami.txt";
$df = shell_exec("df | egrep 'da|ad|hd|sd|ar|md' | awk '{ print $1 \":\" $2 \":\" $3 \":\" $6 }'");
file_put_contents("$file", "$df");
PHPVEG
- A hozzászóláshoz be kell jelentkezni
Nem tűnik egyértelműnek a leírás. Egy numerikus érték kétszeres szorzatát kapod, vagy pedig egy stringet kétszer egymás után?
A PHP script forrása (vagy annak releváns része) jól jönne, valamit a kapott kimenet is, továbbá a cronnal időzített futtatás módja is.
Milyen módon van megoldva az időzítés a cronnal? (crontab -e vagy az /etc/cron.* alatt lévő file-okkal)
- A hozzászóláshoz be kell jelentkezni
Pontosan a ketszereset...
Tehat a szabad hely mondjuk 10232543 ...
Ekkor folyamatosan ezt irja bele a kimenetbe: 20465086
Szoval mindig a ketszereset...
A cronba (/etc/crontab) a sor a kovetkezo:
*/2 * * * * root php /home/script/imon.php
- A hozzászóláshoz be kell jelentkezni
Változtatás nélkül kipróbáltam, és nem jelentkezik az általad leírt dolog.
"Tehat a szabad hely mondjuk 10232543 ...
Ekkor folyamatosan ezt irja bele a kimenetbe: 20465086"
Akkor tisztázzuk a rendszert. Linuxon a df (5.97) kimeneti formátuma:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda1 2885728 187000 2552140 7% /
Tehát az awk az általad hívott módon a file-rendszert, a blokkok számát, a foglalt területet és mountpointot hagyja meg, a szabad helyet (és a kihasználtságot) nem.
Tehát a PHP futása után az eredeti df hányadik oszlopában szereplő szám kétszeresét írja? Emellett a másik szám marad az eredeti, vagy az is duplázódik?
- A hozzászóláshoz be kell jelentkezni
FreeBSD-ken probaltam, 6.2-on es 7.0-an.
Ime egy elo pelda a progi kimeneterol, melyet utana fel akarok dolgozni majd:
Ha kezzel futtatom:
/dev/da0s1a:5077038:2370968:/
/dev/da0s1d:28430604:12016100:/home
/dev/da1s1c:34424816:28927818:/home1
/dev/ad2s1c:77513790:47057718:/home2
Amit en kapok cron-al:
/dev/da0s1a:10154076:4741928:/
/dev/da0s1d:56861208:24032112:/home
/dev/da1s1c:68849632:57855424:/home1
/dev/ad2s1c:155027580:94115436:/home2
- A hozzászóláshoz be kell jelentkezni
Ja es a df parancs kimenete:
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/da0s1a 5077038 2370968 2299908 51% /
/dev/da0s1d 28430604 12016090 14140066 46% /home
/dev/da1s1c 34424816 28927866 2742966 91% /home1
/dev/ad2s1c 77513790 47057718 24254970 66% /home2
- A hozzászóláshoz be kell jelentkezni
A megoldás kulcsa a cron által futtatott parancsokhoz adott környezeti válozókban rejlik.
man df:
Values are displayed in 512-byte per block counts.
BLOCKSIZE If the environment variable BLOCKSIZE is set, the block counts will be displayed in units of that size block.
/etc/profile:
umask 022 BLOCKSIZE=K
Ezért közvetlenül bashből futtatva:
# echo $BLOCKSIZE
K
A cron viszont ezt nem adja tovább a futtatott programok felé, ezért a kétszeres eltérés (1024/512). A megoldás vagy a scriptből felezés, vagy a -k használata, vagy a BLOCKSIZE beállítása lehet.
Ahogy mutattad is, a FreeBSD df-jének is a negyedik oszlopa a szabad hely. A te scripted nem azt írja ki.
- A hozzászóláshoz be kell jelentkezni
Stra, erre soha nem jottem volna ra...
Nos, beirtam a cron valtozoi koze hogy BLOCKSIZE=K, es maris jo minden!
Ez egyszeruen hihetetlen... :)
Koszi
- A hozzászóláshoz be kell jelentkezni