2010-06-07 2 views
2

Я использую unix system() вызовы для файлов gunzip и gzip. Иногда с очень большими файлами (то есть на узле вычисления кластера) они прерываются, а в других случаях (т. Е. В узлах входа) они проходят. Есть ли какой-то мягкий предел во время вызова системы? Что еще это может быть?Время вызова системы?

+4

Это не системный вызов, это вызов функции system(). – 2010-06-07 20:08:28

+0

Фактически, это вызовы системы unix(), т.е. вызовы в систему функций unix() (или были ли они изменены?) - иногда я не получаю комментарии, мои включены. – ShinTakezou

+0

@shin system() не является системным вызовом - это функция в стандартных библиотеках C и C++. Системный вызов - это что-то вроде open() или read(). – 2010-06-08 07:41:27

ответ

1

Вызывающий поток должен блокироваться бесконечно, пока задача, начатая с системой(), не завершится. Если вы наблюдаете, что вызов возвращается, а операция файла не завершена, это указывает на то, что вызванная операция по какой-то причине завершилась неудачей.

Что указывает возвращаемое значение?

+3

ах, ну, это указывало на мою глупость Было ограничение на размер файлов, которые я мог бы создать с помощью пакетной системы кластера. Увеличение лимита с моего основного процесса не повлияло на предел новых процессов, порожденных им. – Arnold

0

Почти наверняка не проблема с использованием системы(), а с выполняемой вами операцией. Всегда проверяйте возвращаемое значение, но тем более вам нужно увидеть вывод команды, которую вы вызываете. Для неинтерактивного использования часто бывает лучше написать stdout и stderr для файлов журналов. Один из способов сделать это - написать сценарий оболочки, который проверяет базовую команду, регистрирует командную строку, перенаправляет stdout и stderr (и закрывает stdin, если вы хотите быть осторожным), а затем выполняет командную строку. Запустите это через system(), а не непосредственно с командой OS.

Мое мнение, что неисправные машины имеют ограниченное дисковое пространство или отсутствуют либо целевой файл, либо фактические команды gzip/gunzip.

0

Я использую unix system() для звонков файлов gunzip и gzip.

Возможно, глупый вопрос: почему бы не использовать zlib прямо из приложения?

И система() не является системным вызовом. Это оболочка fork()/exec()/wait(). Проверьте справочную страницу system(). Если он не разблокируется, возможно, ваше приложение каким-то образом вмешивается в wait() - например. у вас есть обработчик SIGCHLD?

0

Если это Linux-система, я бы порекомендовал использовать strace, чтобы узнать, что происходит и какие блоки сборов.

Вы даже можете прикрепить к Трассирование уже запущенных процессов: # strace -p $PID

0

Похоже, я бегу в то же прерывистый вопрос с указанием тайм-аут какой-то. Мой скрипт работает каждый день. Я начинаю верить, что GZIP имеет тайм-аут.

  1. GZIP -vd filename.txt.gz 2 >> TMP/errorcatch.txt 1 >> logfile.log
  2. Stderr: Ошибка для filename.txt.gz
  3. Переход к следующей команде «ф имя_файла * новый/каталог /», в результате чего в архивных версиях файла в новом каталоге
  4. стандартного вывод из ранее Gzip показывает успешные распакуйте ЖЕ файл: filename.txt.gz: 95,7% - заменяется filename.txt
  5. Преуспевающего out из gzip не существует в исходном или новом каталоге.
  6. Последующие предупреждения, ручной запуск «gzip -vd filename.txt.gz» никогда не прерывается.

Деталь:

  • только один вызов в скрипте, чтобы распаковать то этот файл
  • вызова для разархивируете внутри функции (для более лесозаготовок rebust и оповещения)
  • Невозможно Трассирования в производстве
  • Невозможно реплицироваться локально
  • В течение последних месяцев не найдено согласованности между размером файла, только

Я просто буду работать над ним с помощью логики повторения и улучшения общих сценариев, но я хочу, чтобы следующий google-er знал, что они не сумасшедшие. Это происходит с другими людьми!

Смежные вопросы