Как можно избавиться отвременного файла в данном случае?
Товарищи, нужен ваш совет :)
Есть код (пример):
#!/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)
Как в данном случае можно избавиться от временного файла? Есть идеи у кого?
Заранее спасибо :)
- 3866 просмотров
Страница для печати


Очистка временых файлов в shell-скриптах .
Но не совсем понятно что ты хочешь сделать. Зачем паралельно пускать 100 пингов?
Пинги это просто пример.
В реальном случае тут запускается функция в потоках (она проверяет dnsbl'ы (spam-check помнишь?)), которая возвращает (код завершения, return) 1, если ip в базе. Так вот фишка в том, что родительский процесс не может получить код завершения, т.к. запускаю в бэкграунде (потоки ведь нужны), поэтому пишу код завершения в файл, а потом смотрю, что в нем.
Код примера и реальный код, который в скрипте, идентичны (в смысле алгоритм).
Сделать хочу, чтобы временный файл совсем не использовался. Т.е., в идеале, передать все коды завершения потоков родителю.
За линк спасибо, это уже сделано.
Как то так
Можно без fifo вообще, просто for ... done | while read ... done если не смущает что while будет отфоркан и ты не сможешь передать переменные последующему скрипту.
Ты - гений!!! )))
"for ... done | while read ... done" -- то, что надо )))
А вот передать переменные последующему скрипту можно, например, так ;)
ЗЫЖ А FIFO разве не является файлом, т.е. фактически при его создании на диск ничего не пишется?
Да можно так, хотя мне никогда не нравилось так делать. Но это уже вкусовщина Ж:-)
fifo это специальный "файл" с буфером в 4 килобайта (обычно) который нужно открывать "с двух концов". Если процесс открывает один его конец, а другой закрыт, то система морозит этот процесс (не отдает управление после write() или read()), пока другой конец fifo не откроет другой процесс.
Другое название fifo - именованый пайп. В отличии от неименованных пайпов cmd | cmd
Да, я не спорю, решение не идеальное, я бы это даже костылем назвал )))
Спасибо, что такое фифо и как работает я знаю. Я только не могу понять, пайп на диск пишется или он в ОЗУ сидит, хоть и отображается как файл в ФС? Другими словами, при создании фифо операция записи на диск происходит или нет?
Происходит только запись inode. Если диск виртуальный типа tmpfs, то и записи не происходит.
Сами данные на диск, естественно, не пишутся. Буфер находится в оперативке.
Т.е. значит все же операция записи происходит... А для флешек это не очень хорошо :))
Спасибо большое )))
создавай в /dev/shm Ж:-) там обычно tmpfs
А если у юзера его нет? ;)) Скрипт-то распространяется в сети )))
Отправить комментарий