Hozzászólások
Hát, a ciklusos ránézegetés itt még oké is, mert nem számottevő az erőforrás-igénye, hacsak nincs pl. több tízezer file a könyvtáradban, mert azt feldolgozni már zúzósabb.
Az is igaz, hogy kicsit túllövés erre külön kódot írni, de... csak nem tudtam megállni, úgyhogy itt van, ha másnak nem, hát sormintának jó lesz valahová :) :
[code:1:d83723b2f9]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define __USE_GNU
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
int go_daemon = 0;
const char* dirname = "/tmp/ize";
int fd_access, fd_modify, fd_create, fd_delete, fd_rename, fd_attrib;
void sigio_handler(int signo, siginfo_t *info, void* context)
{
const char *reason;
if (info->si_fd == fd_access) reason = "access";
else if (info->si_fd == fd_modify) reason = "modify";
else if (info->si_fd == fd_create) reason = "create";
else if (info->si_fd == fd_delete) reason = "delete";
else if (info->si_fd == fd_rename) reason = "rename";
else if (info->si_fd == fd_attrib) reason = "attrib";
else reason = "unknown";
printf("Event happened; action='%s'\n", reason);
}
int my_open(const char *dirname, int mask)
{
int fd;
fd = open(dirname, O_RDONLY);
if (fd < 0)
exit(printf("Can't open %s; err='%s'\n", dirname, strerror(errno)));
if (fcntl(fd, F_SETSIG, SIGRTMIN))
exit(printf("Can't change signal; err='%s'\n", strerror(errno)));
if (fcntl(fd, F_NOTIFY, mask | DN_MULTISHOT))
exit(printf("Can't set F_NOTIFY; err='%s'\n", strerror(errno)));
return fd;
}
int main(void)
{
int i, j;
struct sigaction action;
action.sa_handler = NULL;
action.sa_sigaction = sigio_handler;
sigemptyset(&action.sa_mask);
action.sa_flags = SA_SIGINFO | SA_NOMASK;
action.sa_restorer = NULL;
if (go_daemon)
{
i = fork();
if (i < 0)
return printf("Can't fork daemon process; err='%s'\n", strerror(errno));
else if (i > 0)
return 0;
/*for (i = 0; i < 3; i++)
{
j = open("/dev/null");
if (j < 0)
return printf("Can't open /dev/null; err='%s'\n", strerror(errno));
if (dup2(j, i) < 0)
return printf("Can't redirect standard fd to /dev/null; fd='%d', err='%s'\n", i, strerror(errno));
close(j);
}*/
setsid();
}
if (sigaction(SIGRTMIN, &action, NULL))
return printf("Can't register SIGIO handler; err='%s'\n", strerror(errno));
fd_access = my_open(dirname, DN_ACCESS);
fd_modify = my_open(dirname, DN_MODIFY);
fd_create = my_open(dirname, DN_CREATE);
fd_delete = my_open(dirname, DN_DELETE);
fd_rename = my_open(dirname, DN_RENAME);
fd_attrib = my_open(dirname, DN_ATTRIB);
while (1) pause();
}
// vim:ts=4:noexpandtab:cino='':shiftwidth=4:
[/code:1:d83723b2f9]
Ez itt csak írkálja, hogy mi is történt annak a szerencsétlen könyvtárnak a file-jaival (igen, tudom, nem szerencsés signal handlerből printf-et hívni), és ennek okán daemon-módban nem is zárattam le vele az stdin/out/err-t, ahogy azt kellene. Plusz nem parancssori paraméterből szedem a könyvtárnevet, azt, hogy menjen-e daemon-módba, a hibakezelése is finoman szólva trehány, tehát ez a kód _csak_vázlat_.
Akit csak fárasztottam vele, attól bocsi, aki meg tudja használni valamire, annak pedig sok szerencsét :)!
- A hozzászóláshoz be kell jelentkezni
Köszi! Ugyan én most maradok a parancssori eszközöknél, de jó lesz ez máshova! Jól látom, ez C-ben van?
Többezer fájlt nem kell átviszgálni, a temorary könyvtárak nem tartalmaznak ennyit, és egyes fájlok vizsgálata sem tart egy másodpercnél tovább. Ha ezt sleepelem néhány másodpercre, akkor az pont ideális.
Egy behatolásfigyelő programot készítettem, eddig crontaboltam, de kicsit sokalltam az 1 percet. Ezt a progiköteget ciklusba rakva, néhány másodpercre szunnyantva kb. 1, esemény bekövetkeztekor és annak feldolgozásakor max 3%-os CPU-terheltséget ad, ami bőven a tűréshatáron belül van.
Egy automatizált tükröző rendszert is készítek, primitíven egyszerű, és néhány forintból megvan, csak egy munkaállomásnak megfelelő gépre van szükség. (Volt egy másik változat, ami a SCSI-s RAID-vezérlők egyik nagy előnyét használta ki, de azt anyagi okból elvetették -- milyen hely lehet ez?) Lehet, hogy az marad a crontabban, de lehet, hogy átteszem sleepesre, még meglátom. Mindkét progiköteg egyik fő résztvevője a sed, ami azt hiszem, nem is csoda.
Az ngrepet akarom még munkába fogni, szörnyen tetszik az a szerkezet. Ha az ngrep kimenetét nem utólagosan elemezgetem, hanem már a kapcsolat felállásakor, akkor azzal érdekes dolgokat lehet véghez vinni.
- A hozzászóláshoz be kell jelentkezni
Megint van egy kérdésem:
Mi lehet annak az oka, hogy ha egy tömény adatfolyamot greppelek, majd awkolok, akkor az awk kimenete szörnyen lassan jelenik meg, illetve mit lehet tenni azért, hogy a lehető leggyorsabban megjelenjen az awk kimenete?
- A hozzászóláshoz be kell jelentkezni
Ja, és ha sed-del is szűröm, akkor már teljesen használhatatlan. :( Mit lehet tenni a folyamok szűrésének gyorsításáért?
- A hozzászóláshoz be kell jelentkezni
Hali!
Hogyan lehet megoldani, hogy a sed ne tegye tönkre a sortöréseket?
Ha szövegcserére fogom a sed-et, remekül végrehajtja a feladatát, de a sorvége jelekkel valamit tesz, mert a cserével ellátott állomány kiolvasásakor a sortörések eltűnnek, és egybesorokat kapok. Mit kell mondani a sed-nek, hogy ezt ne tegye?
- A hozzászóláshoz be kell jelentkezni
[quote:34bac8f81e="szucs_t"]Hali!
Hogyan lehet megoldani, hogy a sed ne tegye tönkre a sortöréseket?
Ha szövegcserére fogom a sed-et, remekül végrehajtja a feladatát, de a sorvége jelekkel valamit tesz, mert a cserével ellátott állomány kiolvasásakor a sortörések eltűnnek, és egybesorokat kapok. Mit kell mondani a sed-nek, hogy ezt ne tegye?
A sed egyaltalan nem torodik a sortoresekkel, csak a sorokkal. ird le a hasznalt kifejezesedet, akkor kiderul mit rontottal el.:)
- A hozzászóláshoz be kell jelentkezni
[quote:f3889354de="anr"]A sed egyaltalan nem torodik a sortoresekkel, csak a sorokkal. ird le a hasznalt kifejezesedet, akkor kiderul mit rontottal el.:)
Ilyet írtam:
[code:1:f3889354de]sed 's/soveg errol/szoveg erre/g' < regifajl >ujfajl[/code:1:f3889354de]
- A hozzászóláshoz be kell jelentkezni
A fájlbairányítással van a gond. Mit tegyek jól?
- A hozzászóláshoz be kell jelentkezni
[quote:5d18043bb4="szucs_t"]Ha szövegcserére fogom a sed-et, remekül végrehajtja a feladatát, de a sorvége jelekkel valamit tesz, mert a cserével ellátott állomány kiolvasásakor a sortörések eltűnnek, és egybesorokat kapok.
Ilyesmit csak úgy tudtam előidézni, hogy a kiindulási file dos-os sorvégeket használt (CR LF), és a lecserélendő kifejezés illeszkedett a sorvégre (pl. a sor utolsó szavát cserélni 'alma'-ra: s/[^ ]*$/alma/), így a sed a unixos sorvég (LF) előtti CR karaktert is lecserélte, így aztán úgymond _a dos-os_ sorvégeket 'elrontotta'.
Ha be tudod idézni a pontos sed kifejezésedet ill. azt, hogy a bemeneti file-od milyen sorvégeket használt, esetleg egy-két sort abból is, akkor szívesen utánanézek.
- A hozzászóláshoz be kell jelentkezni
[quote:90ea515db9="gsimon"]Ilyesmit csak úgy tudtam előidézni, hogy a kiindulási file dos-os sorvégeket használt (CR LF), és a lecserélendő kifejezés illeszkedett a sorvégre (pl. a sor utolsó szavát cserélni 'alma'-ra: s/[^ ]*$/alma/), így a sed a unixos sorvég (LF) előtti CR karaktert is lecserélte, így aztán úgymond _a dos-os_ sorvégeket 'elrontotta'.
Ha be tudod idézni a pontos sed kifejezésedet ill. azt, hogy a bemeneti file-od milyen sorvégeket használt, esetleg egy-két sort abból is, akkor szívesen utánanézek.
A parancs:[code:1:90ea515db9]sed 's/netmask 255.255.255.0 up/netmask 255.255.255.0 down/g' < rc.config > rc.config.uj[/code:1:90ea515db9]
Hogy tudom megnézni a bemeneti fájl kódolását? A recode-dal, ha jól tudom, csak átkódolni lehet.
- A hozzászóláshoz be kell jelentkezni
[quote:25af7ae3bd="gsimon"]...és a lecserélendő kifejezés illeszkedett a sorvégre (pl. a sor utolsó szavát cserélni 'alma'-ra: s/[^ ]*$/alma/), így a sed a unixos sorvég (LF) előtti CR karaktert is lecserélte, így aztán úgymond _a dos-os_ sorvégeket 'elrontotta'.
Nekem nem illeszkedik a lecserélendő szöveg a sorvégére.
- A hozzászóláshoz be kell jelentkezni
Van valami, ami, ha más nem, utólagosan átkonvertája a sorvégéket sorvégére?
- A hozzászóláshoz be kell jelentkezni
Bevallom, nem tudtam reprodukálni a jelenséget, nálam rendesen működött.
Legegyszerűbben talán a midnight commander nézőkéjével nézheted meg, hogy milyen sorvégek vannak, F4-et nyomva hexa nézetben, esetleg hexcat vagy hasonló paranccsal, de tekintve, hogy tiszta unix rendszerről van szó (dos/win alatt legalábbis nem láttam még rc.*-ot :)...), nem valószínű, hogy ez a hiba.
A sed parancsban ugyan a pontok nincsenek ki-escape-elve ('255\.255\.255\.0'), így bármire illeszkednek, de ettől még működnie kellene.
A regex lib alapból a tetszőleges karakter-re ('.') illeszti ugyan a sorvégjelet (van ez ellen flagje :REG_NEWLINE), de nálad valószínűleg nem ez az eset, no meg a sed alapból amúgy is soronként olvas és azt dolgozza fel. Próbáld meg ki-escape-elni a pontokat, de nem hiszem, hogy ez lenne a gond. Ezen kívül viszont nincs tippem.
Ha nem ez az, akkor vágj már be ide pár sort abból az rc.config-ból légyszi!
- A hozzászóláshoz be kell jelentkezni
Meg van!
Nyilván meg van rá a magyarázat, mégis különösnek tartom.
A kimeneti fájlnak a végére nem ".uj"-at írtam, hanem "-uj"-at, és úgy kafa minden!
Tehát a parancsom:
[code:1:465b406bde]sed 's/netmask 255.255.255.0 up/netmask 255.255.255.0 down/g' < rc.config > rc.config-uj[/code:1:465b406bde]
Mégis van megkülönböztető kiterjesztése a fájloknak Linux alatt?
- A hozzászóláshoz be kell jelentkezni
[quote:fb8461090a="szucs_t"]Nyilván meg van rá a magyarázat, mégis különösnek tartom.
A kimeneti fájlnak a végére nem ".uj"-at írtam, hanem "-uj"-at, és úgy kafa minden!
Tehát a parancsom:
[code:1:fb8461090a]sed 's/netmask 255.255.255.0 up/netmask 255.255.255.0 down/g' < rc.config > rc.config-uj[/code:1:fb8461090a]
Mégis van megkülönböztető kiterjesztése a fájloknak Linux alatt?
Hát szerintem csak akkor, ha van egy rc.config-uj nevű file-od is, hibás tartalommal, és azt nézed, miközben ő korrektül generálja az rc.config.uj-at :).
De azért örülök, hogy végül is meglett!
- A hozzászóláshoz be kell jelentkezni
[quote:7ac83d494c="gsimon"]...Legegyszerűbben talán a midnight commander nézőkéjével nézheted meg, hogy milyen sorvégek vannak, F4-et nyomva hexa nézetben, esetleg hexcat vagy hasonló paranccsal, de tekintve, hogy tiszta unix rendszerről van szó (dos/win alatt legalábbis nem láttam még rc.*-ot :)...), nem valószínű, hogy ez a hiba.
A sed parancsban ugyan a pontok nincsenek ki-escape-elve ('255\.255\.255\.0'), így bármire illeszkednek, de ettől még működnie kellene.
A "."-ok elé betettem a "\" jelet, de ugyanúgy rossz a régi fájlnévvel. A 0A karaktereket nevezte át 20-ra. Hogy milyen megfontolásból, nem tudom. Érdekes!
Mindegy, fő, hogy az új "." nélküli, "kiterjesztetlen", illetve csak egy kiterjesztéses(?) fájlnévvel működik. Mégis jó lenne tudni, mitől más, ha a fájl kiterjesztésének valamit megadok.
Tyűha, viszont észrevettem, hogy ".uj"-ként is működik, csak ".2" vagy a "." után bármilyen egyetlen számjeggyel nem. Bocsi, félrevezettem mindenkit!
De mi az oka?
- A hozzászóláshoz be kell jelentkezni
[quote:9393d4892d="gsimon"]Hát szerintem csak akkor, ha van egy rc.config-uj nevű file-od is, hibás tartalommal, és azt nézed, miközben ő korrektül generálja az rc.config.uj-at :).
De azért örülök, hogy végül is meglett!
Tény és való, volt már mindenféle létrehozott fájl, de rosszul generálta le, de csak akkor, ha a fájl vége egy pont, és utána egy számjegy. Mi az ördögért?
- A hozzászóláshoz be kell jelentkezni
[quote:441c0e854e="szucs_t"]Tény és való, volt már mindenféle létrehozott fájl, de rosszul generálta le, de csak akkor, ha a fájl vége egy pont, és utána egy számjegy. Mi az ördögért?
Most már akkor is érdekel, ha közben megoldódott :) !
Hmm. Pont-számjegyre végződő file-ok... Kissé manpage-hangulata van, és akként nézve tényleg áttördelve is jelenik meg (pl. 'man -l rc.config.0'-val). Mivel nézted? Simán ki-cat-elve is ömlesztve látszik?
(Pl. a midnight nézőkéje, ha valamilyen formátumúnak ítéli, átzavarja az általa jónak tartott szűrőn, és annak a kimenetét mutatja, ill. F4-re _annak_ a hezdump-ját... F8 a raw mode)
- A hozzászóláshoz be kell jelentkezni
[quote:744daa9d5a="gsimon"]Most már akkor is érdekel, ha közben megoldódott :) !
Hmm. Pont-számjegyre végződő file-ok... Kissé manpage-hangulata van, és akként nézve tényleg áttördelve is jelenik meg (pl. 'man -l rc.config.0'-val). Mivel nézted? Simán ki-cat-elve is ömlesztve látszik?
(Pl. a midnight nézőkéje, ha valamilyen formátumúnak ítéli, átzavarja az általa jónak tartott szűrőn, és annak a kimenetét mutatja, ill. F4-re _annak_ a hezdump-ját... F8 a raw mode)
Igazad van! Vi-baj minden oké, csak az a nyamvadt MC hülyített be. Aztamindenit, az ilyen marhaságok csinálnak belőlem bohócot, illetve önmagam az ilyen marhaságokkal!
Köszi, a midnight volt az! Úgy látszik, a fejemben már éjfél van. A hexában megjelenített karakterkódok is csak a midnightban furcsák. Hogy lehet kikapcsolni ill. módosítani az MC-ben ezeket a szűrőket? Az F8-as átkapcsolgatás nem rossz, de tutira beleakadok hasonló hibába (bár ezek után nem valószínű!
- A hozzászóláshoz be kell jelentkezni
[quote:8c741d4ca6="szucs_t"]Hogy lehet kikapcsolni ill. módosítani az MC-ben ezeket a szűrőket? Az F8-as átkapcsolgatás nem rossz, de tutira beleakadok hasonló hibába (bár ezek után nem valószínű!
F3 helyett Shift+F3.
- A hozzászóláshoz be kell jelentkezni
[quote:f5f3e99b88="reviczky"]1) minden sor, ami "$$$"-vel kezdödik és csak szám van a végén (nem pedig szám-pont-szám) azt törölni akarom
Erre valami ilyesmit próbáltam:
[code:1:f5f3e99b88]sed /^[\$].*[^\.].*/d file[/code:1:f5f3e99b88] de ez így minden "$$$"-os sort kiszedte.
Érdekes, hogy csak a pontosokat viszont ki tudom szedni [code:1:f5f3e99b88]sed /^[\$].*[\.].*/d file[/code:1:f5f3e99b88]-el.
Teljesen jogos, hogy a második megy, az első meg nem. A második esetben megfogalmazod, hogy bármi, majd egy pont, majd megint bármi. Erre szépen illeszkedik mondjuk az "1.2".
Az első esetben azt fogalmazod meg, hogy bármi, majd egy nem pont, majd megint bármi. Erre is illeszkedik az "1.2". Például az első bármire az "1.", a nem pontra a "2", majd a második bármira az üres "" sztring. De másképp is lehet illeszteni. Persze lehet tudni, hogy a sed pontosan hogyan illeszt, de itt most csak az a lényeg, hogy lehet illeszteni.
Ha azt akarod leírni, hogy rakat számjegy, ami között nincs pont, akkor vonatkoztass el a pont karaktertől, és fogalmazd meg regexp-ben azt, hogy rakat számjegy. Például [0-9]+
- A hozzászóláshoz be kell jelentkezni
[quote:9768b5ff7c="szucs_t"]Hogy lehet kikapcsolni ill. módosítani az MC-ben ezeket a szűrőket? Az F8-as átkapcsolgatás nem rossz, de tutira beleakadok hasonló hibába (bár ezek után nem valószínű!
- options/configuration/Use internal view: off :)
- az extension file-ban a 'view'-t kikommentezni az adott kategóriákra, de onnan nem fog menni az értelmezett nézet
Úgy vettem ki, hogy kapcsolója és/vagy config opciója arra, hogy indításkor a nyers nézetet mutassa, az nincs :(.
- A hozzászóláshoz be kell jelentkezni
Egyébként még annyi megjegyzés, hogy az egy szem karaktert (még ha több karakterként is kódolod le), teljesen fölösleges [] közé tenni. Nyilván [\$] vagy [\.] írható simán \$ vagy \. alakban is.
- A hozzászóláshoz be kell jelentkezni
Köszi mindkettőtöknek!
A Shift+F3 jó megoldás (megszokom!), a Use Internal is jó, a vi akármilyen faramuci is, sok előnye van.
- A hozzászóláshoz be kell jelentkezni
Kicsit más, de bármilyen furcsának is tűnik, ide tartozik: tudtok megoldást arra, hogy a rendszer megadott időközönként ellenőrizze le az e2fs-t, úgy, hogy ő a /?
- A hozzászóláshoz be kell jelentkezni
[quote:4b21f91dbe="szucs_t"]...ellenőrizze le az e2fs-t, úgy, hogy ő a /...
Legjobb tudomásom szerint ez erősen ellenjavallt dolog, legfeljebb akkor érdemes, ha már más megoldás nincs, a root fs csak olvashatóra van mountolva, és az fsck után rögtön újraindítás következik.
Ha belegondolsz, hogy pl. az fsck alatt az adatok lemezen való elhelyezkedése erősen változhat, viszont még az olvasások is cache-elve vannak, a legkevesebb, amire számítani lehet, az a korrupt olvasás, ami már önmagában sem egészséges. Ha ehhez hozzávesszük, hogy (az FHS-sel ellentétben) általában a root fs írhatóra van mountolva, még a lemezen is korrumpálja az adatokat, magyarán ha az fsck írja a lemezt, akkor több kárt csinál(hat), mint hasznot.
Elvileg read-only root fs esetén csak ellenőrzésre használható az fsck, mert nincs írás, tehát írási cache sem, így még ki nem írt adat sem. Ehhez egyszerűen be kell rakni cron-ba, és kész, mert ha nem sikerül az ellenőrzés, a parancs kimenetét a cron úgyis levélben küldi a megadott címre (man e2fsck, man crontab, man 5 crontab).
- A hozzászóláshoz be kell jelentkezni
[quote:3e814f6dbd="gsimon"]Legjobb tudomásom szerint ez erősen ellenjavallt dolog, legfeljebb akkor érdemes, ha már más megoldás nincs, a root fs csak olvashatóra van mountolva, és az fsck után rögtön újraindítás következik.
Természetesen nem akarom felcsatolva ellenőrizni, éppen ez a lényeg! Automatán ellenőrizné és szükség szerint kijavítaná saját hibáit. Illetve az bosszant engem, hogy a sok fel-lefűzésnél, pontosabban az újraindítgatások sokasága (ami évekre vetítve tűnik soknak) után a következő újraindításnál állandóan figyelmeztet a rendszer, hogy sokszor volt újraindítva. Ezzel akarnék kezdeni valamit azon kívül, hogy ne indítsam újra a rendszert, mert vannak extrém esetek, amikor szükség van erre (és eppen egy ilyen extrém eset automatizált kezelését kívánom megoldani egy érdekesen egyszerű és olcsó módszerrel -- a honlapomon majd, ha sikeres lesz, elárulom, mi is az).
- A hozzászóláshoz be kell jelentkezni
[quote:72b815308c="szucs_t"]Illetve az bosszant engem, hogy a sok fel-lefűzésnél, pontosabban az újraindítgatások sokasága (ami évekre vetítve tűnik soknak) után a következő újraindításnál állandóan figyelmeztet a rendszer, hogy sokszor volt újraindítva.
A tune2fs '-c' és '-i' opciói a te barátaid. Átírhatod, hogy hány újraindítás ill. mennyi idő után csináljon mindenképpen ellenőrzést, ill. le is tilthatod, bár a manpage-en van egy-két érv ez ellen.
- A hozzászóláshoz be kell jelentkezni
[quote:140622a723="gsimon"]A tune2fs '-c' és '-i' opciói a te barátaid. Átírhatod, hogy hány újraindítás ill. mennyi idő után csináljon mindenképpen ellenőrzést, ill. le is tilthatod, bár a manpage-en van egy-két érv ez ellen.
Tényleg ez a barátom, és te is, köszi! Ez jó lesz!
Arra van valamilyen jó ötlet, hogy a crontab minimálisan 1 percét lecsökkentsük mondjuk 5-10 másodpercre? Vagy van valamilyen események figyelésére szakosodott héjprogram? Ha például megváltozik egy könyvtár tartalma, azonnal jelezzen. Ha ez is megvan, jön a királyság-császárság (ahogyan egy ismerősöm szokta volt mondani).
- A hozzászóláshoz be kell jelentkezni
[quote:4c2e689aba="szucs_t"]Arra van valamilyen jó ötlet, hogy a crontab minimálisan 1 percét lecsökkentsük mondjuk 5-10 másodpercre?
Nem tudok ilyesmiről, legalábbis alapcsomagból nem.
[quote:4c2e689aba="szucs_t"]Ha például megváltozik egy könyvtár tartalma, azonnal jelezzen.
C-ből és perl-ből a doksik szerint lehet (2.4-től felfelé), bár még nem próbáltam. Elvileg az fcntl()-nek lehet olyat mondani, hogy F_NOTIFY, eseményeket, hogy mikre ugorjon (olvasás, írás, létrehozás, törlés, átnevezés, attribútum-változtatás), ilyenkor dob egy SIGIO signal-t, amit aztán úgy kezel le az ember, ahogy akar.
Ha minden jól megy, akkor próbálok estére v. holnapra összerakni egy kis példát rá (legalább én is kipróbálom :)...), de most van egy kis találkozóm egy makrancos kódrészlettel és a gdb-vel :evil:.
Perl vagy C érdekelne inkább?
- A hozzászóláshoz be kell jelentkezni
Az mkfifo-val is próbálkoztam, de semmivel sem gyorsabb. Másfajta megközelítési mód kellene. Mi lehet az?
- A hozzászóláshoz be kell jelentkezni
Na, perl-ben összeütöttem valamit, ami (jelen esetben) kiír egy sort, ha történik valami a '/tmp/ize' könyvtárban. Amit még ki kell reszelnem, hogy ugyan nyerjük már ki valahogy a handler-ben vagy a maszkot, hogy mi történt, vagy legalább az fd-t, hogy mivel, de egyelőre csak szívok vele. Van egy olyan, hogy bits/siginfo.ph, abban van si_fd() meg si_band(), ezt húzza be a linux/signal.ph, de képtelen vagyok működésre rugdalni.
Valakinek ötlete?
[code:1:06f8ed968e]
#!/usr/bin/perl -w
use strict;
use Config;
use Fcntl qw(F_NOTIFY DN_ACCESS DN_MODIFY DN_CREATE DN_DELETE DN_RENAME DN_ATTRIB DN_MULTISHOT);
my ($fd);
$| = 1;
sub sigio_handler()
{
print "valami tortent a /tmp/ize-vel\n";
}
$SIG{IO} = \&sigio_handler;
open($fd, "/tmp/ize") || die "Can't open /tmp/ize";
fcntl($fd, F_NOTIFY, DN_ACCESS | DN_MODIFY | DN_CREATE | DN_DELETE | DN_RENAME | DN_ATTRIB | DN_MULTISHOT) ||
die "Can't set F_NOTIFY on the fd";
while (<>)
{
print $_;
}
[/code:1:06f8ed968e]
- A hozzászóláshoz be kell jelentkezni
[quote:fbc4487488="szucs_t"]Mi lehet annak az oka, hogy ha egy tömény adatfolyamot greppelek, majd awkolok, akkor az awk kimenete szörnyen lassan jelenik meg, illetve mit lehet tenni azért, hogy a lehető leggyorsabban megjelenjen az awk kimenete?
Nem tartom kizártnak, hogy az awk kimenete pufferelve van, pl. 4kbyte-onként. Tegyél be a kiírásaid után egy 'fflush()'-t, ha megjavul tőle, akkor ez volt az :).
- A hozzászóláshoz be kell jelentkezni
[quote:dc0deb56e5="gsimon"]Nem tartom kizártnak, hogy az awk kimenete pufferelve van, pl. 4kbyte-onként. Tegyél be a kiírásaid után egy 'fflush()'-t, ha megjavul tőle, akkor ez volt az :).
Köszi, az awk-on segít (a Posix asszem nem érdekel), de ha megadok valami hasonlót:[code:1:dc0deb56e5]ngrep -d eth1 | grep 'bomb|al-kaida' | awk '{print $4; fflush();}' | sed 's/:[0-9]*//g' > /terror/gyanus.log[/code:1:dc0deb56e5], akkor mire a kimeneti fájlban megjelenik a kért adat, addigra lemegy a nap.
- A hozzászóláshoz be kell jelentkezni
Felőlem agyalhattok ezen, de mi lenne ha olyasmit csinálnátok, aminek több haszna van? Aki KDE-t vagy GNOME-t használ, annak ugyanis valószínűleg (inetd-ből) fut egy fam nevű szerver szoftvere (esetleg használhat a disztribed gamin -t is helyette). fam = File Alteration Monitor (SGI találmány), ez pontosan ezt csinálja meg; viszonylag egyszerű C API-ja van, amivel meg lehet kérni, hogy mit figyeljen (dir-t, file-t, stb). Akkor már inkább ahhoz írjatok akármilyen nyelvű szkriptet.
- A hozzászóláshoz be kell jelentkezni
Természetesen az előbbi kód balgaság, márcsak azért is, mert az ngrep már önmagában képes a mintakeresésre, de a grepre emellett is szükség lehet, ahogyan a következő kódban is: [code:1:c56a6cc887]ngrep -d eth1 -t -i 'sex|porno|teenies' port 80 | grep '172.16.1.123' >> /gonosz/sag.log[/code:1:c56a6cc887] Azonban ha a grep kimenetét egy awkkal szűröm, majd azt egy seddel, amit végül egy fájlba nyomok, akkor szörnyen lassan érkezik a folyam a célhoz. Már az awkig is lassú, az awk az fflushsal kicsit gyorsabb, de a sed megint nagyon belassít. Az ngrep és a sed ugye nem pufferel?
- A hozzászóláshoz be kell jelentkezni
Köszi gsimon!
Igazság szerint a C jobb lenne, egyáltalán nem értek Perlül, de ahogyan a kódból látom, majdnem C. A probléma főként az, hogy a Linux programozásába még nem vetettem bele magamat, a DOS-Windows rendszerekhez szoktam (itt szégyellem is magamat). Az fcntl()-t és annak F_NOTIFY-ja tényleg jó megoldásnak tűnik, de meg kell tudnom, hogyan is működnek.
A kérdésedre sajnos én nem tudom a választ, remélem valaki igen. Mert a progika jónak tűnik első ránézésre (mádosikra sem tudom jobban megítélni), ami már önmagában is megoldást nyújt egy-két dologra. Pláne, hogy az eseménykezelés jobb az időzítésnél. Ha megtörtént a változás, akkor bármi mással meg lehet nézni, mi is, és hogyan is, úgyhogy jó lesz ez. Illetve... Hogyan lehet perlben bash utasításokat adni?
- A hozzászóláshoz be kell jelentkezni
[quote:ae20d31880="Zahy"]Aki KDE-t vagy GNOME-t használ, annak ugyanis valószínűleg (inetd-ből) fut egy fam nevű szerver szoftvere (esetleg használhat a disztribed gamin -t is helyette).
Jó lehet az a FAM, de az általa készített programok működnek X nélkül is, héjban futtatva? Valamiféle nagyon egyszerű példát tudnál mutatni?
- A hozzászóláshoz be kell jelentkezni
Félreértetted. A fam egy szerverprogram, az X-től teljesen független, csak épp tudtommal a GNOME és a KDE is használja. Doksinak pedig "man 3 fam" és a "man 1 fam" a javasolt.
- A hozzászóláshoz be kell jelentkezni
Hali!
Két dolgot szeretnék sed-el csinálni:
a forrás fájl úgy néz ki, hogy:
[code:1:07ad0695dd]
$$$szöveg 1.2
szöveg
$$$szöveg 10
szöveg
$$$szöveg 55.12
szöveg
.
.
.
[/code:1:07ad0695dd]
1) minden sor, ami "$$$"-vel kezdödik és csak szám van a végén (nem pedig szám-pont-szám) azt törölni akarom
Erre valami ilyesmit próbáltam:
[code:1:07ad0695dd]sed /^[\$].*[^\.].*/d file[/code:1:07ad0695dd] de ez így minden "$$$"-os sort kiszedte.
Érdekes, hogy csak a pontosokat viszont ki tudom szedni [code:1:07ad0695dd]sed /^[\$].*[\.].*/d file[/code:1:07ad0695dd]-el. Ráadásul a pont negáltja egyáltalán nem akar menni, mert a [code:1:07ad0695dd]sed /^[^\.]/d file[/code:1:07ad0695dd] sem megy (nem ad ki semmit, akkor is ha van pont-tal kezdödö sor).
/hogy most [\.]-ot használok vagy csak [.]-ot nem változtat aproblémán/
2) minden sor, ami "$$$"-vel kezdödik, abban a pontot kettöspontra szeretnem cserélni
Ehhez meg hozzá sem tudok kezdeni (hogyan lehet összehozni, hogy valamire rákeresek és utána csak 1 karaktert cserélek ebben?)
Üdv.:
Ádám
- A hozzászóláshoz be kell jelentkezni
Ha a szovegekben nincs szam, akkor ird ezt:
[code:1:501e3f57cc]sed /^[\$][^0-9]*[^\.].*/d file[/code:1:501e3f57cc]
Ha van bennuk szam, akkor nehezebb dolgod lesz.
- A hozzászóláshoz be kell jelentkezni
A szövegben nincs szám (de pont lehet benne).
Sajnos ezzel sem megy (valahogy nem jó ez a [^\.], de miért?)
- A hozzászóláshoz be kell jelentkezni
[quote:80d7b9d426="reviczky"]
1) minden sor, ami "$$$"-vel kezdödik és csak szám van a végén (nem pedig szám-pont-szám) azt törölni akarom
2) minden sor, ami "$$$"-vel kezdödik, abban a pontot kettöspontra szeretnem cserélni
Ehhez meg hozzá sem tudok kezdeni (hogyan lehet összehozni, hogy valamire rákeresek és utána csak 1 karaktert cserélek ebben?)
[code:1:80d7b9d426] sed '/^\$\$\$.*[^\.0-9][0-9]*$/d;s/^\(\$\$\$[^\.]*\)\.\(.*\)/\1:\2/g' [/code:1:80d7b9d426]
Write-only :), de működik...
- A hozzászóláshoz be kell jelentkezni
Hihetetlen :)))
Akkorát bámultam ezen és müködik mint állat!
Ezer köszi gsimon!
Üdv.:
Ádám
- A hozzászóláshoz be kell jelentkezni
[quote:8e6808d649="reviczky"]
Erre valami ilyesmit próbáltam:
[code:1:8e6808d649]sed /^[\$].*[^\.].*/d file[/code:1:8e6808d649] de ez így minden "$$$"-os sort kiszedte.
2) minden sor, ami "$$$"-vel kezdödik, abban a pontot kettöspontra szeretnem cserélni
Ehhez meg hozzá sem tudok kezdeni (hogyan lehet összehozni, hogy valamire rákeresek és utána csak 1 karaktert cserélek ebben?)
Üdv.:
Ádám
erdemes eloszor tr-vel lecserelnek barmi masra ami tuti nincs a stringben, es utana arra mar tudsz sed-et irni, egyebkent a legtobbet az info sed-ben a LIST-re keresve talasz:
`
- '
`[^LIST]'
Matches any single character in LIST: for example, `[aeiou]'
matches all vowels. A list may include sequences like
`CHAR1-CHAR2', which matches any character between (inclusive)
CHAR1 and CHAR2.
A leading `^' reverses the meaning of LIST, so that it matches any
single character _not_ in LIST. To include `]' in the list, make
it the first character (after the `^' if needed), to include `-'
in the list, make it the first or last; to include `^' put it
after the first character.
The characters `$', `*', `.', `[', and `\' are normally not
special within LIST. For example, `[\*]' matches either `\' or
`*', because the `\' is not special here. However, strings like
`[.ch.]', `[=a=]', and `[:space:]' are special within LIST and
represent collating symbols, equivalence classes, and character
classes, respectively, and `[' is therefore special within LIST
when it is followed by `.', `=', or `:'. Also, when not in
`POSIXLY_CORRECT' mode, special escapes like `\n' and `\t' are
recognized within LIST. *Note Escapes::.
De talan a forrasban kene megnezni mit csinal ilyenkor amikor . van a []-ben.
- A hozzászóláshoz be kell jelentkezni
Aha, köszönöm ezt a hozzászólást is, így világos hogy az enyém miért nem ment.
- A hozzászóláshoz be kell jelentkezni
[quote:3d26a926f0="Zahy"]Félreértetted. A fam egy szerverprogram, az X-től teljesen független, csak épp tudtommal a GNOME és a KDE is használja. Doksinak pedig "man 3 fam" és a "man 1 fam" a javasolt.
Értem, köszi! Nekem ugyan nincs fent sem Gnome, sem KDE, és sajnos maga a FAM sem, de megnézem, bár úgy látom, nem lesz könnyű feltelepíteni a kerneltámogatás miatt.
- A hozzászóláshoz be kell jelentkezni
Közben találtam egy egyszerű, bár időzítéssel rendelkező eseményfigyelő megoldást: a ciklust. A crontabbal és az egy percével szenvedtem, miközben nincs rá szükség. Kedvem szerint időzíthetek a sleep paranccsal, "oszt jóccakát"! A trapre vagyok még kíváncsi, azzal is megoldható néhány dolog. Meg lesz ez az eseménykezelés egyszerű eszközökkel, mindenféle telepítgetés nélkül. Az awk helyett is néhány esetben elegendő a cut, ami gyorsabb. Nagyon sok dolgot tudnak ezek a parancssoros eszközök. A sed sem olyan lassú!
- A hozzászóláshoz be kell jelentkezni