Sziasztok!
Szeretnék timeout-os cat parancsot csinálni.
Pontosabban szeretném ha cat egy named pipe kiolvasása után visszatérne és nem blokkolna.
példa:
mkfifo /tmp/named.pipe 2>/dev/null
exec 12<> /tmp/named.pipe
echo 'hello world' >&12
echo 'second line' >&12
cat <&12
Ameddig eljutottam:
egy sort ki tudok olvasni:
ha a cat helyett
TEMP=''
read -t 1 TEMP <&12
echo "$TEMP"
használok
épp ezt próbálom ciklusban meghívni, de kiváncsi vagyok hátha van egyszerűbb megoldás
Előre is köszi
- 1518 megtekintés
Hozzászólások
dd bs=16k count=1
vagy valami ilyesmi szerintem jó lesz. A dd-t egy darab jó nagy blokk olvasására kéred meg, ő beolvas annyit amennyit tud és boldogan visszatér egy csonka blokkal. A 16k nagyobb, mint amennyi a pipe pufferébe egyszerre belefér (asszem). Ha egyszeri adat vár kiolvasásra, azzal ez megoldható. Ha az író folyamatosan ír, vagy nem tudod hogy mikor végez, akkor úgysem úszod meg a ciklust. Named pipe-on (az "igazi" név nélküli pipe-tól eltérően) nincs EOF, nem látod hogy aki ír bele az mikor zárja le ezt a fájlleírót.
Szerk: a dd tippem szerint beblokkol, ha egyetlen árva byte sem vár rá. Valszeg conv=noblock segít ezen.
- A hozzászóláshoz be kell jelentkezni
Ezaz, ezt kerestem :)
cat_timeout()
{
dd bs=64k count=1 iflag=nonblock 2>/dev/null
}
pipe(7) szerint a méret 64k:
"In Linux versions before 2.6.11, the capacity of a pipe was the same as the system page size (e.g., 4096 bytes on x86).
Since Linux 2.6.11, the pipe capacity is 65536 bytes."
Köszönöm szépen a tippet.
- A hozzászóláshoz be kell jelentkezni
Én is köszi a pontosítást a pipemérettel meg a nonblock opció pontos szintaxisával kapcsolatban.
- A hozzászóláshoz be kell jelentkezni
Egyébként teszt szkript lesz
háttérben indított folyamatoknak ír a bemenetére és az ennek hatásásra keletkező kimenetet vizsgálja
Ha nincs timeout akkor kell sleep az írás és az olvasás közé, nem úszom meg.
- A hozzászóláshoz be kell jelentkezni
A read-del és ciklussal megvalósított timeout cat:
#!/bin/bash
# named pipe read/write
cat_timeout()
{
if [ $# -lt 1 ] ; then
CAT_TIMEOUT_TIME=1 # default timeout value
else
CAT_TIMEOUT_TIME="$1" # timeout is specified with argument
fi
CAT_TIMEOUT_TEMP='1'
CAT_TIMEOUT_TOTAL=""
while [ "$CAT_TIMEOUT_TEMP" != "" ] ; do
CAT_TIMEOUT_TEMP=""
read -t "$CAT_TIMEOUT_TIME" CAT_TIMEOUT_TEMP
if [ "$CAT_TIMEOUT_TOTAL" != "" ] ; then
CAT_TIMEOUT_TOTAL=`printf '%s\n%s' "$CAT_TIMEOUT_TOTAL" "$CAT_TIMEOUT_TEMP"`
else
CAT_TIMEOUT_TOTAL="$CAT_TIMEOUT_TEMP"
fi
done
echo "$CAT_TIMEOUT_TOTAL"
}
mkfifo /tmp/named.pipe 2>/dev/null
exec 12<> /tmp/named.pipe
echo 'hello world' >&12
echo 'second line' >&12
cat_timeout <&12
- A hozzászóláshoz be kell jelentkezni
Az expect-tel jaro pelda a 'timed-run', ime:
#!/usr/bin/expect -f
# run a program for a given amount of time
# i.e. time 20 long_running_program
set timeout [lindex $argv 0]
eval spawn [lrange $argv 1 end]
expect
aztan
./timed-run 5 cat /tmp/fifo
- A hozzászóláshoz be kell jelentkezni
Ígéretes, köszi.
Az expect önmagában is érdekes, ha sikerül egy kicsit jobban megismernem lehet hogy az egész szkriptet abban írom.
- A hozzászóláshoz be kell jelentkezni
Nem tudom mi a pontos feladatod, de az expect tkp. egy tcl kiterjesztes, igy minden feladat megoldhato vele. Ha meg grafikus feluletre is szukseged van, akkor expectk, ami wish+expect.
- A hozzászóláshoz be kell jelentkezni