Опять про файлы в HP-UX

Тема в разделе "WASM.UNIX", создана пользователем Quantum, 9 дек 2007.

  1. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Как Вы уже знаете, запускаю я процесс следующей командой: ./process > somefile 2>&1 &

    :)

    Так вот, размер файла somefile желательно периодически сбрасывать, для чего в линуксе я обычно использую банальный "> somefile", на в HP-UX почему-то наблюдается, что размер файл сначала обнуляется, но после следующей операции записи из процесса его размер восстанавливается и продолжает расти. Думаю, что это связано с тем, что система сохраняет значение курсора в хендле открытого файла даже после ">" (lsof, кстати, подтверждает эту теорию). Как быть? Нагуглил уже кучу подобных ситуаций, но ни в одной из них не нашёл нормальных путей решения.

    Может, вместо > нужно >> юзать?

    В саппорте HP мне вообще порекомендовали заюзать какие-то ключи к ls и file, которые системой даже не поддерживаются - ересь полная.
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    может быть, сделать тогда обнуление размера и запись отдельными операциями?
    Вроде
    cat /dev/null > somefile
    ./process > somefile 2>&1 &
     
  3. tigsid

    tigsid Member

    Публикаций:
    0
    Регистрация:
    11 июн 2004
    Сообщения:
    62
    ну может проще на Си накатать
    программку которая будет сбрасывать stdout и stderr
    в файл и по определенному сигналу обнулять этот файл.

    Или использовать уже готовую программу логер.
    Тот же стандартный syslogd/logger например.
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    green
    Разве cat /dev/null > somefile чем-то отличается от > somefile ?

    Останавливать процесс нельзя. Никакие изменения вносить в его код тоже нельзя.

    Нашёл в гугле, что можно посылать процессу какой-то стандартный сигнал, по которому он сам обязан закрывать все открытые файлы, но не факт, что процесс правильно обработает этот сигнал, а не упадёт. Поэтому тоже отпадает.

    tigsid
    Так мне всё равно придётся перезапускать процесс, чтоб он писАл в эту программку, а не в файл напрямую. Не вариант :dntknw:
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Странно, что перенавправление каналов не дает нужного эффекта. По идее, '>' уничтожает содержимое целевого файла, а '>>' дописывает в его конец.

    Но раз дело дошло до брутальностей, то можно сделать так:

    1. Посылать процессу SIGUSR1/2. В обработчике этого сигнала грохать файл.
    2. Переписать механизм самого sh. К счастью действий потребуется выполнить минимум:
    1. Ваша программа получает имя процесса, тип перенаправления (с уничтожением/без), и имена файлов куда надо перенаправлять.
    2. Процесс fork'ается.
    3. Родительский процесс отправляется на тот свет.
    4. Дочерний процесс, в зависимости от опций, уничтожает/открывает файл, замещая дескрипторы STDIN, STDOUT, STDERR на дескриптор открытого файла.
    5. Дочерний процесс делает exec на целевой процесс.


    Правда, я не помню точно, могут ли возникнуть сложности с наследованием открытых дескрипторов, но, кажется, с STDIN, STDOUT, STDERR проблем нет.
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Mika0x65
    Как я уже сообщил выше, менять в процессе ничего нельзя, даже перезапускать его нельзя, а воздействовать извне нужно максимально осторожно.

    О каком sh речь?

    Интересует решение на уровне внешних операций с файлом, а не со стороны процесса. Кстати, раньше всё это прекрасно работало в Линуксе с помощью crontab: архивирую текущий файл, обнуляю его размер (командой >) - и все дела. А теперь система мигрировала на HP-UX и начались проблемы.
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Quantum
    Ага, значит вариант с сигналами отпадает. Тогда вариант с sh.

    Речь идет о том sh, который выполняет запуск программы -- можно написать программу, которая сама выполняет перенаправление каналов, вместо sh. Ведь проблема, как я понимаю, именно в этом: операция '>' реализована sh не совсем так, как требуется. Почему бы не сделать перенаправление самому, гарантированно обнулив файл? Правда, для запуски программы с перенаправлением каналов потребуется еще одна программа, но если это не запрещено, то можно воспользоваться.
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Mika0x65
    Дык, процесс ведь уже запущен :) Останавливать его нельзя.
     
  9. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Quantum
    Тогда, наверно, не остаётся ничего, кроме как переоткрыть хендл изнутри процесса.
    Отладчиком, например.
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Уже перезапустил процесс и отключил лог. Пришлось вырубить мониторинг кластера. Вроде, никто не заметил.
     
  11. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Quantum
    Раз длина обнулялась, значит тебе просто не повезло - ты затирал в момент записи.
    Надо было просто повторить операцию несколько раз и желательно написать Си-шный вариант
    для "быстроты" действий или приоритет дать задачке затирания наивысший.
     
  12. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    valterg
    Попытка обрезать файл применялась неоднократно на протяжении нескольких дней :) Как оказалось, нужно было юзать >> вместо >, как я и предполагал в самом начале.