inetd wait és /bin/cat

Fórumok

Sziasztok,

Adott a jmxterm, ami egy lassan induló CLI alkalmazás. Nem csak terminálról működik, lehet bármilyen FD az stdin/stdout. Azt szeretném, hogy egyszer kelljen elindítani, majd több processz is futtathasson benne parancsokat (különböző monitoring pluginek).

A nehezítések:
* tcp-n át is be tudjak kérdezni, ne csak lokálisan
* párhuzamosan több bekérdezés is elindulhat (a jmxterm csak egy klienssel beszéljen egy időben, de elutasítani egyet sem szabad)
* nem akarok saját szoftvert írni, meglévő eszközökkel kellene megoldani

Az (x)inetd "wait" majdnem pont jó erre, de nem egészen.

(Előre is köszi.)

Hozzászólások

Hát most ez lett:

server:


#!/bin/bash

mkfifo /var/run/jmxterm/jmx_{in,out}

exec 5<> /var/run/jmxterm/jmx_in
exec 6<> /var/run/jmxterm/jmx_out
exec /usr/bin/socat -ly -,ignoreeof SYSTEM:/usr/bin/jmxterm <&5 >&6

client:


#!/bin/bash

trap "{
        kill %%
        wait %% 2>/dev/null
        flock -u 5
}" EXIT

exec 5> /var/run/jmxterm/jmxterm.lock
flock -x 5

cat </var/run/jmxterm/jmx_out &
cat >/var/run/jmxterm/jmx_in

A client működik inetd-ből is mint nowait service és a lock állítja sorba a kéréseket. Nem a legszebb, de egyelőre működik.

Most, hogy volt időm jobban utánajárni, erre egyszerűsödött le a fenti:

server:


/usr/bin/socat -t0 SYSTEM:'java -jar /usr/lib/jmxterm/jmxterm-1.0-alpha-4-uber.jar -l $JMX_REMOTE -n -v silent' \
        UNIX-LISTEN:/var/run/jmxterm-socket,mode=XXX,fork

client:


/usr/bin/socat -t0.5 -W/tmp/jmxterm.lock - UNIX-CONNECT:/var/run/jmxterm-socket

Ez már tetszik.

Semmi közöm hozzá, meg már másképp csináltad, de szerintem nem túl szerencsés a file descriptort bedrótozni, mert senki sem mondta, hogy az szabad. A live linuxomban csinálok ilyesmit, ott valami ehhez hasonló van:

exec {fd}<> "$FIFO"

Hivatkozni a későbbiekben $fd-vel lehet rá.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Lécci adj egy shell nevet és verziót és egy kb 3 soros példát amin működik. Először végigkerestem a bash man-ját sűrű kanyázások közben, de nem találtam a leírásban. Aztán kipróbáltam ezt:

bash$ exec 5< /etc/profile
bash$ while read a ; do echo "$a" ; done <&5
.... (a /etc/profile tartalma)

Majd annyit változtattam volna, hogy az 5 helyére ezt írom {x}, a done után meg ugye ${x} - no már ez se ment, kidobott a bash egy hibaüzenetet, hogy {x} számára nem létezik, de azért boldogan elkezdte az exec-et és az átirányítást végrehajtani. Aztán megpróbáltam {fd} -vel, hátha csak spéci változóra megy, de úgy se sikerült. Szóval most kicsit értetlenül szemlélem a dolgokat.

Kivancsisagbol rakerestem a manualban (en sem hallottam rola :-)), valahol a 3.1.17 es 4.1.5 kozott kerulhetett bele. A REDIRECTION fejezetben ir rola:

Each redirection that may be preceded by a file descriptor number may instead be preceded by a word of the form {varname}. In this case, for each redirection operator except >&- and <&-, the shell will allocate a file descriptor greater than 10 and assign it to varname. If >&- or <&- is preceded by {varname}, the value of varname defines the file descriptor to close.

Itt 3.2.51.(1) van, abban nincs ez a csoda. De a FreeBSD-s bash manuálban megtaláltam. Hát kösz, ma is tanultam valamit, amitől nem biztos, hogy jó nekem :-) De legalább a fenti példa ebben a bash verzióban már működik. Az meg külön jó, hogy a ${varname} persze innentől kellemesen elérhető. Az még egy érdekes kérdés, hogy az íly módon kapott FD-re vajon be van-e állítva a Close-on-exec flag, vagy netán ezt is megöröklik a bash-ból indított processzek, jó kis információszivárgást lehetővé téve. Tudom, nem lehetek ennyire szemét, hogy ezt feltételezem, hogy ennyire hülyék lennének.

És szereti ha azt mondom, hogy typeset -r varname (gyengébbek kedvéért: readonly varname), mert onnantól már nem működik ez a vicces lehetőség ;-)

Hát ezt most nem tudom eldönteni, hogy ez - a COE hiánya - egy olyan fícsör aminek örülni kell, vagy olyan, amitől sírni. (Korn-)shell alatt, én asszem a büdös életben nem akartam olyat, hogy

exec 9
random_program.ami ír/olvas az fd9-re/ről open nélkül

Csak és kizárólag olyat, amikor az erre szolgáló eszközökkel értem el:

read -u 9 var
echo "$var" >&9
print -u 9 "$var"
random_program <&9

De ugyebár a második kettő bash-ban nem létezik csak ksh-ban, a 2. és a 4. ezzel szemben nem igazán használja az fd9-et, hisz FD-duplikálás zajlik, nem pedig a FD9 direkt piszkálása. Szóval ha nem mondtok értelmes indokot a COE hiányára, akkor inkább sírok.

Hát most hirtelen ez ugrott be;
tee -vel duplikálom a streamet és mindkét példányt stdin-re küldöm feldolgozásra.


#!/bin/bash

exec {fd}> >(socat -ly -lpdvr0-to-mcast -u - UDP4-SENDTO:$RAWSTREAM_ADDR:$RAWSTREAM_PORT)

gnutv -out stdout 2> >(stdbuf -o0 tr '\r' '\n' | logger -t gnutv -p daemon.info) | \
  tee /dev/fd/$fd | \
  cvlc - ":sout=[...]"
exec {fd}>&-

Mondjuk ezt FIFO-val is meg lehetne oldani, csak így nem kell vesződni vele.

[muszi@muszi temp]$ cat test
#! /bin/bash

exec 5</etc/hostname

echo "${0##*/}: open files:"
ls -l "/proc/self/fd"
read -p "${0##*/}: press a key... "

"$0-exec"

[muszi@muszi temp]$ cat test-exec
#! /bin/bash

echo "${0##*/}: open files:"
ls -l "/proc/self/fd"
read -p "${0##*/}: press a key... "

[muszi@muszi temp]$ ./test
test: open files:
total 0
lrwx------   1 muszi    muszi          64 Oct  8 19:51 0 -> /dev/pts/1
lrwx------   1 muszi    muszi          64 Oct  8 19:51 1 -> /dev/pts/1
lrwx------   1 muszi    muszi          64 Oct  8 19:51 2 -> /dev/pts/1
lr-x------   1 muszi    muszi          64 Oct  8 19:51 3 -> /proc/2584/fd
lr-x------   1 muszi    muszi          64 Oct  8 19:51 5 -> /etc/hostname
test: press a key...
test-exec: open files:
total 0
lrwx------   1 muszi    muszi          64 Oct  8 19:51 0 -> /dev/pts/1
lrwx------   1 muszi    muszi          64 Oct  8 19:51 1 -> /dev/pts/1
lrwx------   1 muszi    muszi          64 Oct  8 19:51 2 -> /dev/pts/1
lr-x------   1 muszi    muszi          64 Oct  8 19:51 3 -> /proc/2586/fd
lr-x------   1 muszi    muszi          64 Oct  8 19:51 5 -> /etc/hostname
test-exec: press a key...

dash-0.5.7:

$ ./test
test: open files:
total 0
lrwx------   1 muszi    muszi          64 Oct  9 07:56 0 -> /dev/pts/5
lrwx------   1 muszi    muszi          64 Oct  9 07:56 1 -> /dev/pts/5
lrwx------   1 muszi    muszi          64 Oct  9 07:56 2 -> /dev/pts/5
lr-x------   1 muszi    muszi          64 Oct  9 07:56 3 -> /proc/6385/fd
lr-x------   1 muszi    muszi          64 Oct  9 07:56 5 -> /etc/hostname
test: press a key...
test-exec: open files:
total 0
lrwx------   1 muszi    muszi          64 Oct  9 07:56 0 -> /dev/pts/5
lrwx------   1 muszi    muszi          64 Oct  9 07:56 1 -> /dev/pts/5
lrwx------   1 muszi    muszi          64 Oct  9 07:56 2 -> /dev/pts/5
lr-x------   1 muszi    muszi          64 Oct  9 07:56 3 -> /proc/6387/fd
lr-x------   1 muszi    muszi          64 Oct  9 07:56 5 -> /etc/hostname
test-exec: press a key...