abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 17:33 | Nová verze

    Canonical vydal (email, blog, YouTube) Ubuntu 24.04 LTS Noble Numbat. Přehled novinek v poznámkách k vydání a také příspěvcích na blogu: novinky v desktopu a novinky v bezpečnosti. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu MATE, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 10. LTS verzi.

    Ladislav Hagara | Komentářů: 4
    včera 14:22 | Komunita

    Na YouTube je k dispozici videozáznam z včerejšího Czech Open Source Policy Forum 2024.

    Ladislav Hagara | Komentářů: 1
    včera 13:22 | Nová verze

    Fossil (Wikipedie) byl vydán ve verzi 2.24. Jedná se o distribuovaný systém správy verzí propojený se správou chyb, wiki stránek a blogů s integrovaným webovým rozhraním. Vše běží z jednoho jediného spustitelného souboru a uloženo je v SQLite databázi.

    Ladislav Hagara | Komentářů: 0
    včera 12:44 | Nová verze

    Byla vydána nová stabilní verze 6.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 124. Přehled novinek i s náhledy v příspěvku na blogu. Vypíchnout lze Spořič paměti (Memory Saver) automaticky hibernující karty, které nebyly nějakou dobu používány nebo vylepšené Odběry (Feed Reader).

    Ladislav Hagara | Komentářů: 0
    včera 04:55 | Nová verze

    OpenJS Foundation, oficiální projekt konsorcia Linux Foundation, oznámila vydání verze 22 otevřeného multiplatformního prostředí pro vývoj a běh síťových aplikací napsaných v JavaScriptu Node.js (Wikipedie). V říjnu se verze 22 stane novou aktivní LTS verzí. Podpora je plánována do dubna 2027.

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Nová verze

    Byla vydána verze 8.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a v informačním videu. Zdůrazněn je průvodce migrací hostů z VMware ESXi do Proxmoxu.

    Ladislav Hagara | Komentářů: 0
    včera 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    24.4. 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 12
    24.4. 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    24.4. 13:44 | IT novinky

    Oznámeny byly nové Raspberry Pi Compute Module 4S. Vedle původní 1 GB varianty jsou nově k dispozici také varianty s 2 GB, 4 GB a 8 GB paměti. Compute Modules 4S mají na rozdíl od Compute Module 4 tvar a velikost Compute Module 3+ a předchozích. Lze tak provést snadný upgrade.

    Ladislav Hagara | Komentářů: 0
    KDE Plasma 6
     (73%)
     (9%)
     (2%)
     (16%)
    Celkem 764 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: Využití pojmenované roury v Linuxu

    polo23 avatar 15.2.2010 20:25 polo23 | skóre: 28 | blog: polo23
    Využití pojmenované roury v Linuxu
    Přečteno: 1785×
    Ahoj, zrovna si ctu knizku Vilema Vychodila: Linux - prirucka ceskeho uzivatele. No neni mi moc jasne vyuziti pojmenovanych rour v linuxu. Uvedu priklad:
    mkfifo moje_roura
    find /usr/share -type d >moje_roura 
    cat moje_roura | grep zoneinfo
    Co to dela chapu. Ale zaroven jsem si vyzkousel misto roury pouzit obycejny textak kam jsme ladoval data a pak je z neho precetl. Vysledek byl stejny. Muzete mi prosim napsat k cemu se prakticky pojmenovane roury pouzivaji? Pri tom laborovani jsme si vsimnul toho ze kdyz jsem spustil prikaz find tak on nic nedelal az do chvile kdy jsem sputil prikaz cat. Z toho mi vyplyva ze cele to zacne fungovat az ve chvili kdy je na rouru pripojeno neco co zapisuje a zaroven neco co cte. Ale k cemu je tohle zrovna dobre me ted nenapada. Diky za vysvetleni.


    Řešení dotazu:


    Odpovědi

    15.2.2010 20:36 Semo | skóre: 45 | blog: Semo
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Odovzdavanie informacii mozes spravit aj cez textak, ale textak by si musel aktivne periodicky kontrolovat. Tu len pasivne cakas a system ta zobudi az treba.

    Spravis si napr. programcek, ktory bude stahovat subory, ktorych URL mu cez pomenovanu pipu posles. Staci ti na to:
    cat fifo |
    while read url; do
        wget "$url"
    done
    Zaroven pokial uz budes mat prilis vela neprecitanych dat v pipe, tak system zablokuje zapisovatelov. Co moze byt vyhoda alebo aj nie. Ale da sa zapisovat aj tak, aby ma to nezablokovalo ak je plno.
    If you hold a Unix shell up to your ear, you can you hear the C.
    15.2.2010 20:39 Semo | skóre: 45 | blog: Semo
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Ten programcek bezi iba jediny a pritom zapisovat do pipy moze hocikolko procesov. To cez beznu nepomenovanu pipu nespravis. Trocha tam potom mozu nastavat problemy su synchronizaciou zapisovatelov (aby jedno url nebolo vlozene do prostred druheho), ale na nenarocne desktopove pouzitie by sa na to slo vykaslat.
    If you hold a Unix shell up to your ear, you can you hear the C.
    polo23 avatar 15.2.2010 21:27 polo23 | skóre: 28 | blog: polo23
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Prave to s tim zapisovanim nekolika procesu zaraz mi prijde jako blbost... To tam jsou ta data navzajem prokladana a vznikne z toho gulas. Proces co z toho cte v tom pak musi mit zmatek.
    15.2.2010 21:35 Semo | skóre: 45 | blog: Semo
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    preto tam mam nenarocne desktopove pouzitie. Kde stahujes par malo url sa hodinu. Riziko, ze zapis vo fife bude prekladany je minimalny a pripadne nasledky male. Zapisujuci mozu samozrejme dobrovolne respektovat nejaky zamok (vytvorenie suboru s dohodnutym prefixom a pid ako suffix), ale potom mas riziko, ze ak zapisovac neodomkne (spadne pocas zapisu), tak sa vsetko zastavi.

    Viacero zapisovacov pouzivajucich ten isty subor dopadne rovnako. Musel by si ukladat obsah do suborov s nahodnym nazvom v dohodnutom adresari a stahovac bude periodicky prechadzat adresar, citat a mazat subory. Tym sa to ale o nieco komplikuje. Nieco za nieco.
    If you hold a Unix shell up to your ear, you can you hear the C.
    15.2.2010 21:44 Filip Jirsák | skóre: 68 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Klasický případ použití roury je propojení několika programů:
    ps ax | grep 'firefox'
    
    Tohle je ale anonymní (nepojmenovaná) roura – oba procesy (ten, který do ní zapisuje, i ten, který z ní čte) musíte vytvořit najednou. Pokud ty programy potřebujete spustit odděleně, použijete právě tu pojmenovanou rouru. Typický je případ, kdy v době vytváření prvního procesu (zapisujícího) ještě ani nevíte, co bude tím procesem, který bude data číst – tedy nechcete někde zadrátovat napevno, čím se budou data z roury zpracovávat, ale chcete to ponechat na uživateli. Přesměrujete je tedy do pojmenované roury a uživatel si je odsud už může číst čím chce.
    16.2.2010 10:37 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Ne možná typické použití (jak je zde již popsáno), ale:
    Používám je na kontrolu memory leak-ů pomocí Valgrind.
    A to u kontroly consolové aplikace pro výpis hlášení (chybového výstupu) Valgrind do druhé terminálového okna a hezky vidím v jednom terminálu běh aplikace a v druhém hlášení o „problémech“.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    Fuky avatar 16.2.2010 16:05 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu

    Další možné použití jsou např. multivolume archívy:

    $ mkfifo /tmp/tar.fifo
    $ split -b 100k /tmp/tar.fifo archive.tgz- & tar zcf /tmp/tar.fifo data
    
    frEon avatar 16.2.2010 16:24 frEon | skóre: 40 | Praha
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    hoi,

    rozdil uvidis v techto dvou prikladech:
    cd /tmp
    touch soubor
    time cat soubor
    
    cd /tmp
    mkfifo roura
    time cat roura
    
    Slovy, u roury nikdy nenactes konec souboru a proto toho muzes vyuzit treba tak, ze cekas na data az se dockas, misto toho aby jsi se musel kazdou chvili kouknout jestli tam uz neco je.
    Talking about music is like dancing to architecture.
    16.2.2010 18:38 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Ale zaroven jsem si vyzkousel misto roury pouzit obycejny textak kam jsme ladoval data a pak je z neho precetl. Vysledek byl stejny.
    Nebyl. Soubor zůstal na disku. Zabíral místo ale na druhou stranu si takový soubor můžete za rok přečíst znova.

    Roura (ať už pojmenovaná nebo ne) funguje jinak: co do ní zapíšete, si hned musíte přečíst, a jednou přečtená data už nemůžete přečíst znova. Proto taky zapisovací program čeká na ten čtecí, jinak by zapisoval do prázdna. Na disk se nic neukládá.
    Muzete mi prosim napsat k cemu se prakticky pojmenovane roury pouzivaji?
    Pro cokoliv, kde potřebujete rouru, ale nemůžete použít anonymní rouru |. Např. v bashi lze anonymní rouru použít pouze pro přesměrování stdout, ale ne stderr, takže na to druhé musíte mít pojmenovanou rouru. Bash má na tvorbu takové roury pro výstup resp. vstup a napojení dalšího programu nástroje >(program) a <(program).

    In Ada the typical infinite loop would normally be terminated by detonation.
    Fuky avatar 16.2.2010 19:28 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu

    Není pravda, že: ... v bashi lze anonymní rouru použít pouze pro přesměrování stdout, ale ne stderr ...

    $ program 2>&1 |zpracuj_stdout_a_stderr
    $ program >/dev/null 2>&1 |zpracuj_stderr
    
    16.2.2010 20:34 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Stále pomocí roury odebíráte stdout...
    In Ada the typical infinite loop would normally be terminated by detonation.
    Fuky avatar 16.2.2010 22:29 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu

    Nesouhlas, při startu programu ukazuje file deskriptor stdout na anonymní rouru, ovšem 2>&1 zařídí, že na ní bude ukazovat i file deskriptor stderr, když poté zavolám >/dev/null bude se na vstupu anonymní roury opravdu odebírat jen stderr, protože stdout je nyní file deskriptor na /dev/null a s anonymní rourou nemá již nic společného.

    $ ls -l /proc/PID/fd
    0 -> /dev/pts/9
    1 -> /dev/null
    2 -> pipe:[118037]
    $ program 2>&1 >/dev/null |zpracuj_stderr
    

    Jinak je velice důležité pořadí viz níže, pokud si nejprve přesměruju stdout do /dev/null, ztratím file deskriptor na anonymní rouru a přesměrováním stderr na stdout přesměruji vlastně na /dev/null.

    $ program >/dev/null 2>&1 |nezpracuje_nic
    

    Někomu by se mohlo hodit:

    $ program > >(zpracuj_stdout) 2> >(zpracuj_stderr)
    

    Process Substitution

    17.2.2010 05:45 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    To je akorát tahanice o slovíčka. Z jiného úhlu pohledu trubka bere natvrdo stdout a je jedno co se na něj interně "předrátuje".
    Jinak je velice důležité pořadí viz níže
    V tom případě to máte v prvním příspěvku špatně.
    $ program > >(zpracuj_stdout) 2> >(zpracuj_stderr)
    Ano a to jsou ty pojmenované roury jak jsem o nich psal.
    In Ada the typical infinite loop would normally be terminated by detonation.
    Fuky avatar 17.2.2010 12:31 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu

    Není to tahanice o slovíčka, věci je třeba jednoznačně definovat a důležité je pochopit princip. To není o jiném úhlu pohledu, roura v žádném případě "nebere natvrdo" stdout, ale stdout implicitně ukazuje na zapisovací file descriptor roury, což je dost zásadní rozdíl. ;-)

    Process Substitution se implementují buď pomocí pojmenovaných rour a nebo pomocí nepojmenovaných. A minimálně na Linuxových systémech používá Bash 3.2 právě roury nepojmenované (anonymní). ;-) Viz:

    $ vim subst.c
    static char *
    process_substitute (string, open_for_read_in_child)
         char *string;
         int open_for_read_in_child;
    {
      char *pathname;
      int fd, result;
      pid_t old_pid, pid;
    #if defined (HAVE_DEV_FD)
      int parent_pipe_fd, child_pipe_fd;
      int fildes[2];
    #endif /* HAVE_DEV_FD */
    #if defined (JOB_CONTROL)
      pid_t old_pipeline_pgrp;
    #endif
    
      if (!string || !*string || wordexp_only)
        return ((char *)NULL);
    
    #if !defined (HAVE_DEV_FD)
      pathname = make_named_pipe ();
    #else /* HAVE_DEV_FD */
      if (pipe (fildes) < 0)
        {
          sys_error (_("cannot make pipe for process substitution"));
          return ((char *)NULL);
        }
      /* If OPEN_FOR_READ_IN_CHILD == 1, we want to use the write end of
         the pipe in the parent, otherwise the read end. */
      parent_pipe_fd = fildes[open_for_read_in_child];
      child_pipe_fd = fildes[1 - open_for_read_in_child];
      /* Move the parent end of the pipe to some high file descriptor, to
         avoid clashes with FDs used by the script. */
      parent_pipe_fd = move_to_high_fd (parent_pipe_fd, 1, 64);
    
      pathname = make_dev_fd_filename (parent_pipe_fd);
    #endif /* HAVE_DEV_FD */
    
    17.2.2010 13:55 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Pokud narážíte na devfd, tak to pojmenované roury jsou.
    In Ada the typical infinite loop would normally be terminated by detonation.
    Fuky avatar 17.2.2010 14:33 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Ano, jde mi o /dev/fd, kde je dostupná i anonymní roura, kterou vytvořil Process Substitution. Pokud si opravdu myslíte, že jde o rouru pojmenovanou, tak mi to prosím vysvětlete. Z uvedeného kódu je zřejmé, že se využívá fci pipe() a ne mkfifo().
    17.2.2010 17:35 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Pokud si opravdu myslíte, že jde o rouru pojmenovanou
    Roura je pojmenovaná právě tím, že se jmenuje /dev/fd/X.
    In Ada the typical infinite loop would normally be terminated by detonation.
    Fuky avatar 17.2.2010 18:25 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu

    Čemu z toho co jsem psal nerozumíš? Pokud se použije na Linuxu v Bashi "Process Substitution", tak se vytvoří nepojmenovaná roura pomocí funkce pipe(). Na systémech, kde se nepoužívají nepojmenované roury se používají roury pojmenované a ty se ukládají do $TMPDIR, což není mimochodem v žádném případě /dev/fd! Více informací viz zdrojáky Bashe.

    static char *
    make_named_pipe ()
    {
      char *tname;
    
      tname = sh_mktmpname ("sh-np", MT_USERANDOM);
      if (mkfifo (tname, 0600) < 0)
        {
          free (tname);
          return ((char *)NULL);
        }
    
      add_fifo_list (tname);
      return (tname);
    }
    

    Na závěr Ti ukážu jak vypadá /proc/PID/fd v případě když je stdin jeden konec nepojmenované roury | nebo > >() ("Process Substitution") a na nakonec jak to vypadá, když se v programu přistupuje k pojmenované rouře vytvořené pomocí mkfifo.

    # stdin je předaný pomocí |program
    lr-x------ 0 -> pipe:[121763]
    lrwx------ 1 -> /dev/pts/0
    lrwx------ 2 -> /dev/pts/0
    lr-x------ 4 -> /dev/null
    
    # stdin je předaný pomocí > >(program)
    lr-x------ 0 -> pipe:[123329]
    lrwx------ 1 -> /dev/pts/0
    lrwx------ 2 -> /dev/pts/0
    lr-x------ 4 -> /dev/null
    
    # program využívá /tmp/named.fifo
    lrwx------ 0 -> /dev/pts/0
    lrwx------ 1 -> /dev/pts/0
    lrwx------ 2 -> /dev/pts/0
    lr-x------ 3 -> /tmp/named.fifo
    lr-x------ 4 -> /dev/null
    
    $ ls -l /tmp/named.fifo
    prw-r--r-- /tmp/named.fifo
    

    Tak co, už to chápeš? BTW: Snad nevadí tykání, ja nemám rád, když mi někdo vyká. ;-)

    polo23 avatar 17.2.2010 13:22 polo23 | skóre: 28 | blog: polo23
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Tady bych trochu odbocil od tematu - chtel bych se zeptat zda je v Linuxu pravidlem ze std err byva vzdy vypisovan na monitor? Pokud jsou totiz nekdy situace ze tomu tak neni pak by mel byt zpusob jak toho dosahnout...

    Jak by ste dosahnul toho kdyby bylo potreba vypsat std err na monitor (uvazujme ze by to nebylo implicitne nastaveno), ale std out by bylo potreba zahodit?
    program >/dev/null 2>&1 |nezpracuje_nic
    Tento radek posle std out do /dev/null a std err posle na std out, tim padem pujde taky do /dev/null. Napada me jen to ze std err bych musel smerovat primo na terminal ktery ma uzivatel pusteny.
    Fuky avatar 17.2.2010 14:13 Fuky | skóre: 52 | blog: 4u
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu

    Jak jsem psal výše, pokud chci využít file descriptor stdout, tak ho nejprve musím uložit i do stderr a teprve poté zahodit:

    $ program 2>&1 >/dev/null |zpracuj_stderr
    

    File descriptors se dědí od rodičovského procesu.

    A co se týče vypisování stderr "na monitor", tak nejprve je třeba si uvědomit, že žádné vypisování "na monitor" neprobíhá. Uvedu několik příkladů.

    Naloguju se bez X přímo v terminálu, mám k dispozici Bash, který má k dispozici následující file descriptors. Pokud spustím nějaký program, tak zdědí dceřiný proces tyto descriptory a je pouze na něm jak s nimy naloží.

    $ ls -l /dev/fd/
    0 -> /dev/tty2
    1 -> /dev/tty2
    2 -> /dev/tty2
    3 -> /proc/12710/fd
    

    Po spuštění X a Konsole mám zase k dispozici níže uvedené file descriptors.

    $ ls -l /dev/fd/
    0 -> /dev/pts/3
    1 -> /dev/pts/3
    2 -> /dev/pts/3
    3 -> /proc/12777/fd
    4 -> /dev/null
    

    Takže file descriptors mi vždy implicitně ukazují na terminál kde jsem příkaz spustil tj. o stderr nepřijdu, pokud si ho sám nezničím.

    Mrkni se třeba i na další procesy v systému a jejich file descriptors /proc/PID/fd/.

    Proto je např. třeba, když vytváříš daemona nastavit sdtin, stdout, stderr na /dev/null, aby se osamostatnil od rodičovského procesu se vším všudy.

    def daemonize():
        pid = os.fork()
        if (pid < 0):
            sys.exit(1)
        elif (pid > 0):
            # exit the parent process
            sys.exit(0)
    
        os.setsid()
        os.umask(0)
    
        pid = os.fork()
        if (pid < 0):
            sys.exit(1)
        elif (pid > 0):
            # exit the parent process
            sys.exit(0)
        
        stdin = open("/dev/null", "r")
        stdout = open("/dev/null", "a+")
        stderr = open("/dev/null", "a+", 0)
    
        os.dup2(stdin.fileno(), sys.stdin.fileno())
        os.dup2(stdout.fileno(), sys.stdout.fileno())
        os.dup2(stderr.fileno(), sys.stderr.fileno())
    

    Už je to trochu jasnější?

    polo23 avatar 19.2.2010 11:32 polo23 | skóre: 28 | blog: polo23
    Rozbalit Rozbalit vše Re: Využití pojmenované roury v Linuxu
    Rekl bych ze jo. Dekuji za vysvetleni.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.