fsck adott idoben (tune2fs es date)

Fórumok

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.

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

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 :(

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

É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

kicsit elbonyolitottad a kerdest,de ha jol ertemaz epoch time-ot szeretned kiiratni:

date '+%s'

--
NetBSD - Simplicity is prerequisite for reliability

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.

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"

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 :(

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!

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 :)

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 :)

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

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.

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...

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...)

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