Portál AbcLinuxu, 10. května 2025 06:32
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.
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 :)
sitovy daemon nelze pouzit. to bych neresil potom touhle berlickou.
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.
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
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.
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 ?
#!/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;
super to bylo presne ono. diky za namet. se zbytkem si jiz poradim.
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í?
presne tak jedna se mi o to aby bezel na pozadi a pouze zpracovaval data, ktera protecou rourou
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.