Блокировка файла в shell () (Блокировка файла в shell (аналог flock_t си))
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 218
- ОС: FreeBSD
Блокировка файла в shell ()
Возможно ли средствами shell реализовать блокировку файла?
(в гугле по даному вопросу ничего вразумительного не нашел)
(в гугле по даному вопросу ничего вразумительного не нашел)
-
- Сообщения: 3339
- ОС: Slackware 12.2, ArchLinux 64
Re: Блокировка файла в shell ()
Спасибо сказали:
-
- Сообщения: 218
- ОС: FreeBSD
Re: Блокировка файла в shell ()
спасибо за наводку)
-
- Сообщения: 218
- ОС: FreeBSD
Re: Блокировка файла в shell ()
поправьте меня, если ошибаюсь:
в скрипте создается блокировка на файл спомощью flock, пример
но доступ на чтение и запись к фалу local.txt с других скриптов все равно есть(
или в других скриптах надо делать проверку на блокировку с помощью flock ?
разьясните, пожалуйста
в скрипте создается блокировка на файл спомощью flock, пример
Код: Выделить всё
#!/bin/sh
(flock -x /home/lastpriot/local.txt -c test
ls /
sleep 30
)
200>/tmp/mylock
но доступ на чтение и запись к фалу local.txt с других скриптов все равно есть(
или в других скриптах надо делать проверку на блокировку с помощью flock ?
разьясните, пожалуйста
-
- Бывший модератор
- Сообщения: 4458
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: Блокировка файла в shell ()
Это рекомендательная блокировка. Поэтому да, "в других скриптах надо делать проверку на блокировку с помощью flock". Или включить строгие блокировки для ФС опцией монтирования "mand", а затем для файла - убиранием бита исполнения для группы и установкой бита SGID.
-
- Сообщения: 218
- ОС: FreeBSD
Re: Блокировка файла в shell ()
спасибо)
ещё вопрос по bash'у: как с дочернего процесса передать переменные в родительский?
ещё вопрос по bash'у: как с дочернего процесса передать переменные в родительский?
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Блокировка файла в shell ()
ответ: никак.
можно сделать временный файл. числа от 0 до 255 можно передавать как код возврата. (это не так уж и мало - они могут быть например индексами к БД).
-
- Бывший модератор
- Сообщения: 4458
- Статус: GNU generation
- ОС: Debian GNU/Linux
Re: Блокировка файла в shell ()
Как вариант:
Код: Выделить всё
var=$(
# Дочерний процесс; нужная переменная просто выводится на stdout.
...
echo $result;
)
Конечно, это если сам дочерний процесс ничего другого на stdout не выводит.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Блокировка файла в shell ()
по идее, если что-то выводит, можно создать свой поток: man mkfifo
-
- Бывший модератор
- Сообщения: 4458
- Статус: GNU generation
- ОС: Debian GNU/Linux
-
- Сообщения: 218
- ОС: FreeBSD
Re: Блокировка файла в shell ()
надо возвращать текстовую инф
думал через глобальные переменные, но почему то не сложилось ни с export ни с declare
как временное решение использую tmp-файл, но больше склоняюсь к fifo
кстати, как аналог
Код: Выделить всё
var=$(
# Дочерний процесс; нужная переменная просто выводится на stdout.
...
echo $result;
)
использую такой формат (более лаконичный)
Код: Выделить всё
result=`<script>`
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Блокировка файла в shell ()
Стандартное решение в этом случае — выводить на stdout shell-script вида:
Код: Выделить всё
var1=value1
var2=value2
...
varN=valueN
Код: Выделить всё
eval "$(program arg1 arg2 ... argN)"
Мои розовые очки
-
- Сообщения: 218
- ОС: FreeBSD
Re: Блокировка файла в shell ()
с помощью eval решил вопрос по возврату переменных (организовал в виде массива, избежал написания парсера)
всем спасибо)
всем спасибо)
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Блокировка файла в shell ()
это связанно с безопасностью - злоумышленник ведь может подменить в своём ~/.bashrc переменные, и они поменяются в родительском, (или для родительской программы). Например враг может $PATH, и когда программа запустившая ~/.bashrc запустит ещё что-то, то запустится вовсе не это что-то, а ПО злоумышленника. Причём с правами суперпользователя. Потому дочерний процесс не может менять переменные родителя.
тоже самое. Только в вашем формате не допускает вложенность.
watashiwa_darede... писал(а): ↑05.09.2010 01:17Главное, с квотированием при выводе переменных не накосячить.
довольно опасно, если переменные и значения неизвестно откуда...
а так да, стандартное решение.
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Блокировка файла в shell ()
В bash такой синтаксис deprecated, поэтому лучше его не использовать: можно напороться на странные неизлечимые глюки. Я в своё время напоролся:lastpriot писал(а): ↑05.09.2010 00:51кстати, как аналог
Код: Выделить всё
var=$( # Дочерний процесс; нужная переменная просто выводится на stdout. ... echo $result; )
использую такой формат (более лаконичный)
Код: Выделить всё
result=`<script>`
http://forum.posix.ru/viewtopic.php?id=943
Кроме того, как уже отметил drBatty, он не допускает вложенности.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: Блокировка файла в shell ()
С чего бы? Он просто old style, а в bash его задепрекейтят не раньше, чем в POSIX.
Мои розовые очки
-
- Администратор
- Сообщения: 5404
- ОС: Gentoo
Re: Блокировка файла в shell ()
t.t писал(а): ↑05.09.2010 08:37В bash такой синтаксис deprecated, поэтому лучше его не использовать: можно напороться на странные неизлечимые глюки. Я в своё время напоролся:
http://forum.posix.ru/viewtopic.php?id=943
Кроме того, как уже отметил drBatty, он не допускает вложенности.
1) он допускает вложенность. Для этого внутренние бактики нужно экранировать:
$ echo `echo a \`echo b\` c`
a b c
2) "неизлечимые глюки", приведённые по ссылке, явно связаны с бакслэшем: бактики являются своего рода кавычками, и бакслэши в них интерпретируются особым образом.
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Блокировка файла в shell ()
watashiwa_daredeska писал(а): ↑05.09.2010 09:33С чего бы? Он просто old style, а в bash его задепрекейтят не раньше, чем в POSIX.
Первоисточника навскидку не нашёл, но обсуждений достаточно:
http://mywiki.wooledge.org/BashFAQ/082
http://wiki.bash-hackers.org/scripting/obsolete
http://unix.derkeiler.com/Newsgroups/comp....4/msg00785.html
http://linuxgazette.net/52/okopnik2.html
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Блокировка файла в shell ()
Согласен. Неверно выразился. Такая интерпретация может привести к неожиданному поведению, т.к. конструкции получаются более тяжеловесные и сложные для понимания. Другими словами, если внутри гарантировано нет никаких кавычек и слешей, то можно использовать и обратные кавычки. Но из-за возможных проблем в более сложных случаях этого делать не рекомендуется./dev/random писал(а): ↑05.09.2010 10:281) он допускает вложенность. Для этого внутренние бактики нужно экранировать:
$ echo `echo a \`echo b\` c`
a b c
2) "неизлечимые глюки", приведённые по ссылке, явно связаны с бакслэшем: бактики являются своего рода кавычками, и бакслэши в них интерпретируются особым образом.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: