Az irant erdeklodnek, van-e valami locale, ami Unix-time-ban adja vissza az idot minden progginal, ami hasznalja a locale-t?
Tehat ha beirom, hogy "date", az is Unix-time lenne, de barmilyen masik proggi is.
"Unix-time: 1970.01.01 00:00 ota eltelt masodpercek"
Igazabol a fo gondom az lenne, hogy van ket egesz nagy (2*1T) wincsi adattarolasra, ha ujraindul a gep es elerte a mount_time-t, akkor par oran keresztul fsck megy :) Ritkan fordul elo, de szeretnem minimalizalni, mondjuk egy hetvegi/ejszakai reboot-tal vagy "mount -o ro" segitsegevel, ami akkor hajtodna vegre, ha max. egy hete mar letelt a mount_time. Ezt ugye szepen kiszedem a tune2fs-bol:
/sbin/tune2fs -l /dev/hdc1 | grep "check " | awk '{print $8" "$5}'
Csak itt jon egy baromi hosszu sed, ami minden honapnevet atalakit (Jan helyett 01 meg hasonlok) es ez sem a legjobb, igazabol annak orulnek, ha UNIX-time formaban jellene meg es az akt. datum is, aztan nem lenne nehez kiszamitani, hogy 7 nap mennyi masodperc, ha ezt meghaladta, akkor restart.
Ehhez nagyon jo lenne egy egyseges idomero, UNIX-time meg pont jo lenne erre.
- 1472 megtekintés
Hozzászólások
Ezzel például:
date -d "Wed Jun 30 18:52:45 2010" +%s
A 7 napos mizériát nem értem. Hajnal 3-kor ellenrőzöd a "Next check after" értékét. Ha a beállított idő már eltelt, akkor azonnal futtatod az fsck-t (remount után).
Másrészt ha valamelyik naplozó fájlrendszert használod, akkor sokkal gyorsabb lesz az ellenőrzés.
-----
Dropbox tárhely igénylése: https://www.getdropbox.com/referrals/NTI2MzM2MjA5
- A hozzászóláshoz be kell jelentkezni
Kozben en is turkaltam a neten, bar inkabb szigorlatra kellene keszulnom. De ez valahoyg jobban izgat :)
Egy nagyon jo kis leiras. Es a fenti nem jo, mert pl. a
date -d `date` +%s viszont a
date -d now +%s igen,
sem mukodik. Nem ertettem, miert, vegre kiderult, hogy a "-d" a kov. formaban varja:
"$#vagy egyszerű konverzióhoz használjuk az ISO-8601 formátumot
$ date -d '2007-12-01 11:52pm' "+%s" "
Neha komolyan hulyet tudnek kapni ezektol a datum/ido/tizedes-formatumoktol :)
Igazan ideje lenne az egyseges vilagido bevezetesnek. Mittomen, 1000 egyseg egy ev, aztan jol van, egyseget lehet tovabb bontani, de lehetoleg tizzel, ne hatvannal vagy 24-gyel :)
7 nap: igyekszem hetvegere idoziteni. Mondjuk, ha 12 oras hataridot szabok meg, akkor lehet naponta is futtatni, de ezen meg gondolkodnom kell.
- elotte ne inditsa ujra, minek.
- utana viszont azonnal, szoval par oran belul.
- de ez megse deli tizenkettokor legyen :)
ext3 van mindketto wincsin, de sztem az fsck total fuggetlen attol, hogy naplozo vagy nem (tenyleg nem tudom, sose mertem le). Inkabb attol fugg, mennyi file van rajta, mekkorak, stb. Marpedig szeretik telepakolni sok kis aprosaggal...
belezavarodtam: mukodik a fenti. De akarhogy formazom awk-kal a kimenetet, date -d nem fogadja el :(
- A hozzászóláshoz be kell jelentkezni
Itt valami verzió, vagy disztró függő dolog kavarhat be!
Nálam működik az eredeti változat is. (ubuntu 9.10, date 7.4)
A man-ból:
"The --date=STRING is a mostly free format human readable date string
such as "Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or
even "next Thursday". A date string may contain items indicating
calendar date, time of day, time zone, day of week, relative time,
relative date, and numbers. An empty string indicates the beginning
of the day. The date string format is more complex than is easily
documented here but is fully described in the info documentation."
-----
Dropbox tárhely igénylése: https://www.getdropbox.com/referrals/NTI2MzM2MjA5
- A hozzászóláshoz be kell jelentkezni
Bocs, kesobb irtam, hogy mukodik a fenti.
- A hozzászóláshoz be kell jelentkezni
Én meg nem vettem észre. :-) Én csak annyit tettem, hogy az eredeti utasításod kimenetéből (awk nélkül) a dátumat átmásoltam a date -d után és idézőjelbe tettem.
Az xargs-szal kellene próbálkozni, ha nem kézzel akarod futtatni a date parancsot.
-----
Dropbox tárhely igénylése: https://www.getdropbox.com/referrals/NTI2MzM2MjA5
- A hozzászóláshoz be kell jelentkezni
kicsit elbonyolitottad a kerdest,de ha jol ertemaz epoch time-ot szeretned kiiratni:
date '+%s'
--
NetBSD - Simplicity is prerequisite for reliability
- A hozzászóláshoz be kell jelentkezni
Igen, azt. Gondoltam, megadok minden szukseges infot :) Nehogy az legyen, hoyg valaki nem tud szavazni, mert hianyzik egy valaszlehetoseg :)
- A hozzászóláshoz be kell jelentkezni
Nem tudok ilyen locale-ről, de ha lenne, az sem valószínű hogy segítene, a tune2fs ugyanis kizártnak tartom hogy használna locale-eket. Ha meg nekiállsz belepatchelni, akkor érdemesebb inkább azt belepatchelni, hogy egyenesen Unix időt írjon ki.
A date -d opcióját már többen javasolták, én is csatlakozom. Ha nem akarsz nagyot szívni vele, akkor a tune2fs-t és a date +%s -d ... parancsot is TZ=UTC környezeti változóval futtasd, hogy az időzónák ne kavarjanak be.
- A hozzászóláshoz be kell jelentkezni
Egen, sajnos a tune2fs nem tamogat locale-t :(
date -d jo lenne, csak ra kellene jonnom, milyen formatumot fogad el...
- A hozzászóláshoz be kell jelentkezni
Probalkozok:
celtic:/usr# a=`/sbin/tune2fs -l /dev/sda1 | grep Next | cut -c27-`; echo $a
Sat May 22 20:42:26 2010
celtic:/usr# date -d $a +%s
date: extra operandus: ,,"22""
További információkért adja ki a(z) ,,date --help" parancsot.
celtic:/usr# a=`/sbin/tune2fs -l /dev/sda1 | grep Next | awk '{print $8"-"$5"-"$6 }'` ; echo $a
2010-May-22
celtic:/usr# date -d $a +%s
date: érvénytelen dátum: "2010-May-22"
- A hozzászóláshoz be kell jelentkezni
Rajottem.....
celtic:/usr# a=`/sbin/tune2fs -l /dev/sda1 | grep Next | cut -c27-`; echo $a
Sat May 22 20:42:26 2010
celtic:/usr# date -d "$a" +%s
1274553746
Bazz, megint az a kurva idezojel :(
- A hozzászóláshoz be kell jelentkezni
Akkor ide is irom, hatha vkinek jol jon:
checktime=$(date -d "`/sbin/tune2fs -l /dev/sdb2 | grep Next | cut -c27-`" +%s)
echo $checktime
nowtime=`date +%s`
echo $nowtime
if test $nowtime -ge $checktime
then echo "restart"
else echo "maradunk a fenekunkon"
fi
Persze, a then es else helyett erdemesebb mondjuk "shutdown -r now"-t hasznalni.
Mondjuk, lehet orankent is futtatni, akkor "shutdown -r 1:00" szepen ujrainditja, elvileg hajnali egykor :) No, meg farigcsalok rajta es koszonom mindenkinek!
- A hozzászóláshoz be kell jelentkezni
Meg egy kerdes, hatha ez is ilyen egyszeru :)
Abszolut erteket hogyan allitok elo? A fenti script kapcsan, hogy ne azt nezze, tulhaladta-e mar azt az idot, hanem hogy mondjuk 24 oran belul van-e.
a=`date +%s`
expr $a / 3600
ugye megadja az idot oraban, namost, ha en azt szeretnem, hogy +/- 24 ora van vissza (vagyis ha 23 ora van vissza vagy elmult egy oraja), ugyanugy lefusson a script, szoval ha az ido abszolut ertekben kisebb, mint 24, akkor restart.
Remelem, erthetoen irtam :)
- A hozzászóláshoz be kell jelentkezni
Egyszerű megoldás: Ne az aktuális időhöz, hanem az egy nappal ezelőttihez hasonlitsd a dátumot. (date -d '-1 day' +%s)
-----
Dropbox tárhely igénylése: https://www.getdropbox.com/referrals/NTI2MzM2MjA5
- A hozzászóláshoz be kell jelentkezni
Hmmm, ezen meg gondolkodok. Jelenleg ugye az nem lenne jo, ha a mount ido lejarata elott indulna ujra, hiszen akkor nem lenne fsck. Hmmm, asszem, mindegy, ha 23 oraval tulhaladta, akkor fog lefutni. Csak lesz annyi eszem, hogy ne pont aznap allitsam le a gepet valamiert :)))) (Majd egy scriptet megkerek, hogy ha 36 oranal kevesebb az ido, kuldjon egy levelet, miszerint n. ora mulva lejar a mount-time es fsck lesz, hacsak nem varom meg a kovetkezo reggelt :)
- A hozzászóláshoz be kell jelentkezni
tune2fs Last checked: mindegy, hogyan írja a dátumot, mert írsz 10 perc alatt egy programot, ami kiolvassa.
Ha már eltelt annyi idő, hogy ellenőrizni akarsz, akkor még egyszer tune2fs Mount count: beállítod nagyobbra, mint a Maximum mount count.
reboot
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Oke, de ez nagyon favago megoldas.
De mindettol fuggetlenul erdekelne, hogy lehet egy szam abszolut erteket megallapitani.
Hmmm...igy hirtelen:
HA a > b
AKKOR a-b
KULONBEN b-a
Hat, ez sem szep, de mukodik.
- A hozzászóláshoz be kell jelentkezni
Hogyhogy nem szép? Ez az abszolútérték.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Jo, de ha van ra egy fv, akkor nem irom meg :) De ugy latszik, bash-ban nincs.
- A hozzászóláshoz be kell jelentkezni
Nincs ra fuggveny, de awk-val konnyen megcsinalhatod. Ld:
http://www.unix.com/shell-programming-scripting/18692-absolute-value.ht…
- A hozzászóláshoz be kell jelentkezni
Koszi szepen :) No, errol beszelek, a megoldas mar reg megvan, de mindig jol jon, ha ujat tanulok, amit maskor is tudok hasznositani.
- A hozzászóláshoz be kell jelentkezni
Nem kell bajlódni az eltelt idő számítgatásával. Minden vasárnap éjszaka tune2fs-sel beállítasz egy nagy mount count-ot, amire biztosan beindul az ellenőrzés, aztán reboot. Csak az a kérdés, mi lesz, ha hibát talál, nem tud bebootolni, te meg éppen nem vagy ott.
Ha fontos szerverről van szó, akkor van éjszakai operátor, üzemeltetési rend, effélék. Egy házi szever évekig eldöcög ellenőrzés nélkül.
--
CCC3
- A hozzászóláshoz be kell jelentkezni
Esse rossz, de nem akarom minden vasarnap ujrainditani. Esetleg havonta. Hmm, nem rossz.
Nem fontos, irodai szerver (router/mail/samba/fax). Az alapgond ugy fel eve jott elo, uj kernel utan nem ment rendesen (SATA vezerlo kerult bele) es tobbszor is ujrainditottam, aztan egyszercsak nekiallt az 500G-s wincsit fsck-ni :) Szoval nem valoszinu, hoyg megegyszer elofordul, de ezt kesobb mas gepnel is felhasznalnam.
- A hozzászóláshoz be kell jelentkezni
Az ext2 superblock-ból szépen ki lehet nyerni unixtime-ként az adatot, némi guglizással ezt találtam neked:
#include<linux/ext2_fs.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<string.h>
#define boot_block_size 1024
int main()
{
char *buff = (char *)malloc(sizeof(struct ext2_super_block));
struct ext2_super_block * sblock = (struct ext2_super_block *)malloc(sizeof(struct ext2_super_block));
//open any partition for testing,must be ext2/ext3.
int fd = open("/dev/sda1",O_RDONLY);
//skip the boot block
lseek(fd,boot_block_size,SEEK_CUR);
//read the superblock raw data from disk to buff
read(fd,buff,sizeof(struct ext2_super_block));
//copy buffer to sblock, you can use casting or union for this.
memcpy((void *)sblock,(void *)buff,sizeof(struct ext2_super_block));
printf("\nLast check:%u\n",sblock->s_lastcheck);
close(fd);
return 0;
}
Ebbe szinte semmibe nem tart belehegeszteni az aktuális unixtime-nal való összehasonlítást...
- A hozzászóláshoz be kell jelentkezni
Koszi :) Ugyan csak elvi szinten erdekes, mert nagyon messze vagyok a minimalis programozo szinttol is, de akkor meg lehetne valositani.
- A hozzászóláshoz be kell jelentkezni
az nem elég neked, ha rendszeresen ( gyakrabban, mint a FS check-time -ja) általad választott időben csinálod az fsck-t ?
egy cron-ból jólirányzott touch /forcefsck
és reboot ?
(ha nem / , akkor pedig mégegyszerűbb a dolog...)
- A hozzászóláshoz be kell jelentkezni
De, eleg, meg a fentiek is elegek.
Csak idonkent tovabbgondolom a dolgot, mert eszembe jut mas is. Jelenleg az a script eleg, amit itt fentebb is irtam, majd idovel belerakok egy "abszolut ido ellenorzest" is, de most eppen egy darabig jo a fenti.
- A hozzászóláshoz be kell jelentkezni
No akkor, ideirom a sajat megoldasomat a celra
1. proggi: beallitja a disk default ertekeit
#!/bin/bash
if test $# -ne 2
then clear
echo "Ket parameter kell:"
echo
echo "1. : Hany mountolas lehet max. Erdemes nagyra valasztani, pl. 50"
echo
echo "2. : Hany HONAP mulva legyen FSCK"
echo
exit 0
fi
echo oke
fdisk -l | grep Linux | grep -v swap | awk '{print $1}' > /tmp/wincsik
while read
do
/sbin/tune2fs -c $1 $REPLY
/sbin/tune2fs -i $2m $REPLY
done < /tmp/wincsik
rm /tmp/wincsik
2. proggi, cronbol futtatva, jelenleg +/- 24 orat nez.
#!/bin/bash
fdisk -l | grep Linux | grep -v swap | awk '{print $1}' > /tmp/wincsik
MAXHOUR=24 # Hany ora kulonbseg lehet max. az aktualis ido es a "lejart" ido kozott
RESTART=0 # Alapbol nicns restart
while read
do
WINCSIHOUR=`expr $(date -d "$(/sbin/tune2fs -l $REPLY | grep Next | cut -c27-)" +%s) / 3600`
NOWTIMEHOUR=`expr $(date +%s) / 3600`
if test $NOWTIMEHOUR -gt $WINCSIHOUR
then VANIDO=$(expr $NOWTIMEHOUR - $WINCSIHOUR)
else VANIDO=$(expr $WINCSIHOUR - $NOWTIMEHOUR)
fi
if test $VANIDO -le $MAXHOUR
then RESTART=1
fi
done < /tmp/wincsik
if /usr/bin/test $RESTART -eq 1
then
while read
do /sbin/tune2fs -C $(expr $(/sbin/tune2fs -l $REPLY | grep "Maximum mount count" | awk '{print $4}') + 1) $REPLY
done < /tmp/wincsik
/sbin/shutdown -r now
fi
- A hozzászóláshoz be kell jelentkezni