Открываем файл,

User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

f_evgeny wrote:Так может Вам не прекратить работу надо после удаления файла, а восстановить файл вместе с записанными даннми при завершении, как было до удаления?
И потом, кто кроме root-а может удалить Ваш файл?

Может. Ето еще лучше. Как минимум надо детект ситуацию.
2. Ну откуда ж я знаю? Стоять может в разных местах, че там за порядки - не знаю. Нужна дурак-пруф система.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

zor0n wrote:Так не бывает. просто так файлы никто удалять не станет. Чтобы покоцать файл, всегда необходимо намерение. Как правило, ето один из нижеследующих вариантов:

- Файл пишется в "чужую" область (например, в чужой домашний каталог или в /етц/маил е т.п.) Выход очевиден: создайте "свой" каталог и пишите в него.

- Файл пишется в /tmp и удаляется "мусорщиком." Мусорщики во всех "нормальных" системах удаляют файлы из /tmp только если к ним не было доступа в течение определенного периода времени (1 месяц?). Выход - пишите чаще.

- Файл лежит в "своем" каталоге (напр. в /var/lib/myprogram/ или /var/run/myprogram/) и его все-равно кто-то убивает. Ето уже проблем административная: кому-то явно нечего делать. Вы, например, не будете писать программу, которая удаляет файл, не принадлежащий вам, правильно? Выход: поймать пользователя данного процесса и удалить у него что-нибудь. :nono#:

Я бы начал решать вопрос в етом аксепте, а не техническом. :umnik1:

1. Бывает. Сам случайно удалял. Рука на ентер соскочила.
2. Меня ето никто не спрашивает. Где работать будет и кто что делать будет - не мое дело. Мое дело - чтоб работало как положено.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Strannik223 wrote:Фиг Ли, упомяни операционку что ли.
Во многих Юнихах есть нотификация, FreeBSD, Linux.

"Да купи ж ты лотерею!" (с). В смысле в самом начале написал - Solaris 8.

Вопрос, а нельзя ли заставить удаляющую программу проверять не открыт ли файл кем то и отказываться удалять если открыт.

Каким образом? сабститюте "rm"?
Система то не наша!
Тебе что то вроде LogRotate нужно?

Нет. Для етого BSD-жный syslog годится.
С нотификацией у меня нет уверенности (на любой системе включая Вин) что между действием и обработкой сообщения не пройдет какое то время за которое пишущая прога что то не накидает в удаленный файл. Так что решать надо комплексно.

Да лучше поздно чем никогда.
Мне бы директорию локнуть.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

А может так: при открытии файла создаем hardlink с каки нибудь "мусорным названием" а при закрытии проверяем, если орининал не был удален шаловливыми ручками то удаляем hardlink а если наш файл убили, то переименовываем hardlinked file to original name. Только надо бы предусмотреть зачистку hardlink-ов которые остаются в результате крешей.
Правда остается возможной диверсия: кто то удалил файл и создал новый с таким же именем.
Никакой разрухи нет. (с) Проф. Преображенский.
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Strannik223 wrote:А может так: при открытии файла создаем hardlink с каки нибудь "мусорным названием" а при закрытии проверяем, если орининал не был удален шаловливыми ручками то удаляем hardlink а если наш файл убили, то переименовываем hardlinked file to original name. Только надо бы предусмотреть зачистку hardlink-ов которые остаются в результате крешей.
Правда остается возможной диверсия: кто то удалил файл и создал новый с таким же именем.


Good. Very good. Very brilliant idea. Будем щупать. Thanks. :gen1:
Верить нельзя никому - даже себе. Мне - можно!
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

A. Fig Lee wrote:
Strannik223 wrote:А может так: при открытии файла создаем hardlink...
Good. Very good. Very brilliant idea. Будем щупать. Thanks. :gen1:

А разве VC не именно это и предлагал?
Cheers
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

tengiz wrote:
A. Fig Lee wrote:
Strannik223 wrote:А может так: при открытии файла создаем hardlink...
Good. Very good. Very brilliant idea. Будем щупать. Thanks. :gen1:

А разве VC не именно это и предлагал?


нет. не совсем. Такие мысли у меня в голове тоже крутились, но хардлинк в голову не пришел.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

Так hardlink == link()
А на FreeBSD есть chflags, который позволяет запретить удаление файла. Даже рутом пока обратно флаг не поставиш файл не удалишь. На солярке такого нет?
Никакой разрухи нет. (с) Проф. Преображенский.
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Post by vc »

A. Fig Lee wrote:
tengiz wrote:
A. Fig Lee wrote:
Strannik223 wrote:А может так: при открытии файла создаем hardlink...
Good. Very good. Very brilliant idea. Будем щупать. Thanks. :gen1:

А разве VC не именно это и предлагал?


нет. не совсем. Такие мысли у меня в голове тоже крутились, но хардлинк в голову не пришел.


Actually, what I suggested earlier was indeed a hardlink. I could not care less who offered what and in what specific order, but perhapse the OP does not know what a hardlink is. So for educational purposes, here's the code again:

Code: Select all

#include <unistd.h> 
#include <fcntl.h>
#include <errno.h>

int main() {
  if (link("a.dat", "a.dat.bck") == -1)  /* <- This is a hardlink */
    {printf("Could not create a backup name: %d\n", errno); exit(2);}
  sleep(10);
  if (rename("a.dat.bck", "a.dat") == -1) {
    if (errno == EEXIST) unlink("a.dat.bck");
    else printf("Error renaming : %d\n", errno);
  }
}


You know, that Stevens's book is mighty good ...

VC
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

Strannik223 wrote:А может так: при открытии файла создаем hardlink с каки нибудь "мусорным названием" а при закрытии проверяем, если орининал не был удален шаловливыми ручками то удаляем hardlink а если наш файл убили, то переименовываем hardlinked file to original name. Только надо бы предусмотреть зачистку hardlink-ов которые остаются в результате крешей.
Правда остается возможной диверсия: кто то удалил файл и создал новый с таким же именем.

Вот, это наверное решение на поставленный вопрос. Вт только ИМХО, вопрос поставлен кривовато и так решать хотя и возможно, но на мой взгляд немного некошерно.
Хотя информации немного недостаточно, но я могу себе представить три ситуации и три способа решения данной задачи:
1. Пользовательская программа пишет в файл пользователя в директории пользователя. Удалить никто не может, кроме пользователя или root-а. Защищаться надо от самого пользователя. Защита - резервные копии, ну или, как предложено, хардлинки. Но, хардлинки не будут работать на некоторых ФС и на разных партишенах.
2. Демон пишет данные в свой файл.
An application (or a group of inter-related applications) must use a subdirectory of /var/lib for its data.

Тогда файл находится в директории /var/<имя демона> или /usr/local/var/<имя демона>
Про пермишены у меня в debian-policy написано, что директории должны быть 755 (c правом записи только для пользователя) или c 2755 с правом записи для группы.
Нужна защита от пользователя. При указанном расположении файлов и директориев проблема случайного удаления пользователем не возникает - у пользователя (в том числе и у других демонов не хватает прав).
3. Демон или программа пользователя пишет данные в лог, через демона записи в лог. Нужна защита от злоумышленника (в том чисме и с правами root-а). В общем случае проблема решается только записью логов на специально выделенном компьютере. Демон записи в лог это умеет.
Ссылки по теме - Filesystem Hierarchy Standard http://www.pathname.com/fhs/pub/fhs-2.3.html (Для Линукса)
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

tengiz wrote:Злостный оффтопик.
....
Юмор, конечно, понятен - а что за копирайт на шутку N 21?

Это детский анекдот про заключенных, которые долго сидели в одной камере и вместо того, чтобы рассказывали анекдоты, просто называли их номера.
А такая терминология довольно широко распространена и привычна среди русскоязычных линуксоидов.
Ну, например, если принято решение делать что-то так, а не иначе и сего момента считать что вот этот путь правильный, а остальные - нет, то это называют "Генеральной линией". Ну и так далее.
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

vc wrote:Actually, what I suggested earlier was indeed a hardlink. I could not care less who offered what and in what specific order, but perhapse the OP does not know what a hardlink is. So for educational purposes, here's the code again:

Code: Select all

#include <unistd.h> 
#include <fcntl.h>
#include <errno.h>

....


You know, that Stevens's book is mighty good ...

VC


Во-во. Именно код для едюкейшнел пюрпосес я пропускаю, не читая. Нет смысла, зачем писать программу если все можно через шелл?
Я прочитал идею и подумал о димоне который увеличивал бы каунтер открытого файла и проверял директори ентри.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

f_evgeny wrote:Вот, это наверное решение на поставленный вопрос. Вт только ИМХО, вопрос поставлен кривовато и так решать хотя и возможно, но на мой взгляд немного некошерно.


Muzhiki! Vy zabodali uzhe! Povtorjaju op'jat': dimon, Solaris 8 (mozhet Linux Red Hat) - pishet chasto i mnogo v fajl. Fajl v etot moment ktoto vzjal i udalil.
Верить нельзя никому - даже себе. Мне - можно!
User avatar
f_evgeny
Уже с Приветом
Posts: 10367
Joined: 12 Apr 2001 09:01
Location: Lithuania/UK

Post by f_evgeny »

A. Fig Lee wrote:
f_evgeny wrote:Вот, это наверное решение на поставленный вопрос. Вт только ИМХО, вопрос поставлен кривовато и так решать хотя и возможно, но на мой взгляд немного некошерно.


Muzhiki! Vy zabodali uzhe! Povtorjaju op'jat': dimon, Solaris 8 (mozhet Linux Red Hat) - pishet chasto i mnogo v fajl. Fajl v etot moment ktoto vzjal i udalil.

Зачем же так волноваться?
Вы вправе делать то, что хотите. Но ситуация неправильная.
Такие ситуации бывают только в военное время, когда снаряд попадает в голову. Интересен контекст, в котором у демона, который пишет файл, кто-то берет его и удаляет. :D
User avatar
Strannik223
Уже с Приветом
Posts: 569
Joined: 14 Dec 2003 04:06
Location: Львов->Киев->Торонто

Post by Strannik223 »

vc wrote:Actually, what I suggested earlier was indeed a hardlink. I could not care less who offered what and in what specific order, but perhapse the OP does not know what a hardlink is. So for educational purposes, here's the code again:


vc, вы были однозначно первым, но я объяснил доступнее :mrgreen:
Никакой разрухи нет. (с) Проф. Преображенский.

Return to “Вопросы и новости IT”