Как можно избавиться отвременного файла в данном случае?


angel2s2 аватар

angel2s2 - Posted on 03 Март 2010

Товарищи, нужен ваш совет :)

Есть код (пример):

#!/bin/bash
 
_exit() {
  rm -rf $TMPFILE
  exit $1
}
 
_threads() {
  ping -c 1 example.org &>/dev/null
}
 
TMPFILE=$(mktemp)
echo 0 > $TMPFILE
for I in {1..100} ; do
  ( _threads || echo 1 > $TMPFILE ) &
done
wait
_exit $(cat $TMPFILE)

Как в данном случае можно избавиться от временного файла? Есть идеи у кого?

Заранее спасибо :)

Очистка временых файлов в shell-скриптах .

Но не совсем понятно что ты хочешь сделать. Зачем паралельно пускать 100 пингов?

Пинги это просто пример.

В реальном случае тут запускается функция в потоках (она проверяет dnsbl'ы (spam-check помнишь?)), которая возвращает (код завершения, return) 1, если ip в базе. Так вот фишка в том, что родительский процесс не может получить код завершения, т.к. запускаю в бэкграунде (потоки ведь нужны), поэтому пишу код завершения в файл, а потом смотрю, что в нем.

Код примера и реальный код, который в скрипте, идентичны (в смысле алгоритм).

Сделать хочу, чтобы временный файл совсем не использовался. Т.е., в идеале, передать все коды завершения потоков родителю.

За линк спасибо, это уже сделано.

Как то так

#!/bin/sh
 
FIFO=$(mktemp -u /tmp/`basename $0`-fifo.$$.XXXX)
mkfifo $FIFO
trap "rm -f $FIFO" EXIT
 
HOST_LIST="
linsovet.com
core.org.ua
not.existing
google.com
ya.ru
echo.msk.ru
"
 
_threads() {
  ping -c 10 $1 > /dev/null 2>&1
  echo $? $1
}
 
for HOST in $HOST_LIST ; do
  _threads $HOST &
done > $FIFO &
 
while read CODE HOST; do
    echo $HOST return $CODE
done < $FIFO

Можно без fifo вообще, просто for ... done | while read ... done если не смущает что while будет отфоркан и ты не сможешь передать переменные последующему скрипту.

Ты - гений!!! )))

"for ... done | while read ... done" -- то, что надо )))

А вот передать переменные последующему скрипту можно, например, так ;)

#!/bin/bash
 
HOST_LIST="
linsovet.com
core.org.ua
not.existing
google.com
ya.ru
echo.msk.ru
"
 
_threads() {
  ping -c 1 $1 > /dev/null 2>&1
  echo $? $1
}
 
MC=$( for HOST in $HOST_LIST ; do
  _threads $HOST &
done | \
while read CODE HOST; do
    echo "$CODE"
done )
 
if [ -z "$(echo "$MC" | sed '/0/d')" ] ; then
	exit 0
else
	exit 1
fi

ЗЫЖ А FIFO разве не является файлом, т.е. фактически при его создании на диск ничего не пишется?

Да можно так, хотя мне никогда не нравилось так делать. Но это уже вкусовщина Ж:-)
fifo это специальный "файл" с буфером в 4 килобайта (обычно) который нужно открывать "с двух концов". Если процесс открывает один его конец, а другой закрыт, то система морозит этот процесс (не отдает управление после write() или read()), пока другой конец fifo не откроет другой процесс.

Другое название fifo - именованый пайп. В отличии от неименованных пайпов cmd | cmd

Да, я не спорю, решение не идеальное, я бы это даже костылем назвал )))

Спасибо, что такое фифо и как работает я знаю. Я только не могу понять, пайп на диск пишется или он в ОЗУ сидит, хоть и отображается как файл в ФС? Другими словами, при создании фифо операция записи на диск происходит или нет?

Происходит только запись inode. Если диск виртуальный типа tmpfs, то и записи не происходит.

Сами данные на диск, естественно, не пишутся. Буфер находится в оперативке.

Т.е. значит все же операция записи происходит... А для флешек это не очень хорошо :))

Спасибо большое )))

создавай в /dev/shm Ж:-) там обычно tmpfs

А если у юзера его нет? ;)) Скрипт-то распространяется в сети )))

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.