Portál AbcLinuxu, 10. května 2025 06:32

Dotaz: Perl skript jako daemon

10.4.2009 09:26 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Perl skript jako daemon
Přečteno: 537×
Odpovědět | Admin

Zdravim. mam takovy problem je vubec mozne a popripade jak to zaridit aby mi perl skript cekal jako daemon a cetl data z pojmenovane roury ? Jde mi o to aby vse co spadne z jedne strany do roury z druhe strany vpadlo do toho skriptu a ten si tenhle vstup precte a zpracuje a bude cekat na dalsi vstup. Jak vyresit tenhle skript. hledam, ale nemuzu nic najit. asi hledam spatne. Prosim o nakopnuti. Diky za radu.

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

10.4.2009 09:34 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: Perl skript jako daemon
Odpovědět | | Sbalit | Link | Blokovat | Admin

Pokud by místo pojmenované roury mohl být síťový port, lze využít klasický inet démon. Tvůj skript jen čte ze stdin a zapisuje na stdout, spouštění skriptu a předávání dat již zařizuje inet démon, viz man inetd. Dělal jsem takto i služby ve windows na cygwinu :)

10.4.2009 09:55 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Rozbalit Rozbalit vše Re: Perl skript jako daemon

sitovy daemon  nelze pouzit. to bych neresil potom touhle berlickou.

 

10.4.2009 10:00 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: Perl skript jako daemon

Pokud jde o to, aby ten skript běžel jen jednou (např. si udržuje nějaké globální proměnné), pak by přeci mělo stačit číst v perlu ze stdin, zapisovat na stdout a spustit s přesměrování vstupu/výstupu z/do pipy. Možná jsem to nepochopil, ale trochu nevidím ten problém.

10.4.2009 10:13 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Rozbalit Rozbalit vše Re: Perl skript jako daemon

jde o to aby ten skript bezel neustale a cekal na dalsi a dalsi vstupy. funguje to asi takhle

 

program loguje do pipe -----------> pojmenovana roura ----------------------> skript, ktery posloucha a zpracovava vstupy, ktere padaji do roury
10.4.2009 10:18 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: Perl skript jako daemon

Když bude číst v nekonečné smyčce, tak po spuštění bude běžet stále. Když jej budeš spouštět v nekonečné smyčce, po shození zase najede, dokud nezabiješ shell té smyčky.

10.4.2009 10:36 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Rozbalit Rozbalit vše Re: Perl skript jako daemon

tohle jsem uz poresil, ale jak by asi mel vypadat radek v perlu, ktery si prijme ten vstup pokud jej ctu ze STDIN tak mi to nic nepise

 

skript vypada asi takhle

 

#!/usr/bin/perl -w my $FILE    = '/var/log/pokus.log'; 
open(LOG, ">>$FILE");

while() {
    $vstup = <STDIN>;
    print LOG "$vstup\n";
} close LOG;

 a spoustim jej takhle

 ./skript.pl < pojmenovana_roura

Nicmene pokud do roury dopadnou nejake vstupy do souboru pokus.log se mi nic nezapise. Ale kdyz pouziji prikaz cat pojmenovana_roura, tak se mi data z ni zobrazuji na STDOUT. Delam nekde chybu ?

10.4.2009 13:53 ams
Rozbalit Rozbalit vše Re: Perl skript jako daemon

#!/usr/bin/perl
use warnings;
use strict;

my $FILE = '/var/log/pokus.log';
open(my $LOG, ">>$FILE") or die "Cannot open $FILE: $!";
select((select($LOG),$|=1)[0]);  # Toto je dulezity radek - vypnout bufrovani vystupu

while() {
        my $vstup = <>;
        next unless defined $vstup;
        print $LOG $vstup;
}

close $LOG;

10.4.2009 14:26 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Rozbalit Rozbalit vše Re: Perl skript jako daemon

super to bylo presne ono. diky za namet. se zbytkem si jiz poradim.

10.4.2009 16:33 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Perl skript jako daemon
Klasický problém s bufferováním. Ono se to tam zapisuje, ale uvidíte to až po 4k balíku nebo tak nějak.

Tím odporným selectem se to řešilo možná před 10 lety. Moderněji by to bylo takto:
open(my $log, '>>', $FILE);
$log->autoflush(0);

...a pak všude používat $log místo LOG

Pak máte další problém s tím nekonečným cyklem. Pokud skončí zapisující proces, budete dostávat EOF, a Váš skript se zacyklí na 100% CPU. Buď chcete v tom případě program ukončit, nebo čekat na další vstupy, ale s nějakou prodlevou, abyste nežral CPU (nevím, jestli se nemusí v tomto případě roura zavřít a znovu otevřít).

Jinak dotaz se jmenuje perl skript jako daemon, chcete tedy aby se program choval jako démon, tj. běžel bez terminálu a na pozadí?
In Ada the typical infinite loop would normally be terminated by detonation.
11.4.2009 06:56 hates | skóre: 30 | blog: Jak_jsem_se_dostal_k_linuxu
Rozbalit Rozbalit vše Re: Perl skript jako daemon

presne tak jedna se mi o to aby bezel na pozadi a pouze zpracovaval data, ktera protecou rourou

 

11.4.2009 07:19 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Perl skript jako daemon
Tak na pozadí ho můžete dát několika způsoby:

1) nohup

2) /etc/inittab

3) implementace démonizace ve skriptu - fork, setsid, chroot, setuid, ...
In Ada the typical infinite loop would normally be terminated by detonation.
11.4.2009 09:18 happy barney | skóre: 34 | blog: dont_worry_be_happy
Rozbalit Rozbalit vše Re: Perl skript jako daemon

Založit nové vláknoNahoru

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

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.