Программа tosser предназначена для атомарного перекладывания файлов
из любой вложенности любого количества рабочих каталогов в выходной каталог
с сохранением пути вложенности или с изменением пути, перекодировкой имен
файлов, архивации и проверкой на дубликаты. Имеется встроенный монитор,
отслеживающий работоспособность программы для предотвращения зависания
работы при проблемах с сетевыми файловыми системами и вызывающий
необходимые указанные скрипты для устранения проблем. Широкий набор опций
позволяет произвести выборку файлов с учетом вложенности, маски (образца)
файла, производить перекладывание с учетом приоритетов и сортировки;
выбирать поведение при наличии файла-дубликата в архиве; проверять на
печатные символы; проверять на занятость дескриптора файла любым процессом
в системе путем сканирования псевдофайловой системы /proc; выбирать
владельца файла для создания выходного, архивного файла и для успешного
удаления из входных каталогов; игнорировать или нет пустые файлы и
прочее.
Общий принцип работы следующий: программа сканирует указанные рабочие
каталоги на предмет наличия файлов, запоминает их параметры из информации в
инодах, ожидает указанное время, после чего повторно сканирует рабочие
каталоги, отслеживая изменение размеров с запомнеными. Если размеры файлов
не изменились, а открытые дескрипторы в системе не соотвествуют этим
файлам, то файлы поочередно копируются во временный каталог с именем
hidename и переименовываются в выходной каталог, тем самым обеспечивая
атомарное перемещение на выходе.
- -s выходной каталог. Данная опция обязательна.
- -t временный выходной каталог для создания hidename. Если опция
не указана, под временное имя каталога используется имя каталога из опции
-s. В данный файл копируется содержимое файла из рабочего каталога,
после чего переименовывается в предварительно созданные необходимые
подкаталоги в выходной каталог. Данный каталог должен быть в той же
файловой системе, что и выходный каталог. О имени временного файла см. в
описании опции -H.
- -0 - не перекладывать бинарные файлы (код символа меньше пробела
и не являющийся переводом строки, табуляции, возвратом строки, формата,
вертикальной табуляции;
- Опция -1 указывает завершить исполнение программы после
перекидки всех файлов из рабочих каталогов. Дополнительно к этой опции
возможно указать опцию -I, которая не завершает программу
перекладывания, если все файлы без ошибок были перемещены, либо изначально
отсутствовали при текущем запуске.
- При вызове с опцией -T программа не записывает в лог-файл
сообщение о пустом входном каталоге, а обновляет дату модификации
лог-файла. Эта опция может быть полезна, когда необходимо часто
перезапускать программу, после завершения ее после полного перекладывания
(опция -1 или при мониторинге) для возможности быть готовой срочно
переложить редко появляющиеся файлы, но при этом не засорять лог-файл
частыми сообщениями о пустом входном каталоге.
- -f - отладочный режим, не становиться демоном.
- -p pidfile - файл для записи номер процесса демона, по умолчанию
/var/run/имя_программы.pid Данный файл удаляется совместно с
завершением программы. При включенном мониторинге содержит номер процесса
монитора.
- Опция -P включает проверку открыты ли перемещаемые файлы
каким-либо процессом, сканируя /proc. Требуются права root для
просмотра каталогов процессов, запущенных от любого пользователя, например,
если производится запись программами samba или ftp и так далее.
Перекладывание таких файлов откладывается до закрытия дескритора.
- -u uid - записывать файлы, временно переключая владельца
указанным именем пользователя, если эта опция не указана, то владелец файла
по возможности остается оригинальным, требуется привелегии на смену
пользователя. Можно использовать как численное, так и символьное имя
пользователя.
- Опция -U user_del предназначена для указания пользователя,
которому разрешено удалять файл после переноса из начального каталога,
требуется также привелегии на смену пользователя.
- -e - не игнорировать пустые файлы, а тоже перекладывать,
создавая пустые файлы в выходном каталоге.
- -l путь к файлу с логами программы: дата имя исходного файла, и
его размер и, если файл уже есть в архиве с таким же содержимым, то
дописывается символ = и имя архивного файла. Если опция не указана и вызов
программы был без опции -f, то инфрмация и возникших проблемах
помещаются в syslog с типом LOG_ERR.
- При вызове программы tosser без опции -h, любая вложенность
каталогов, в том числе и пустая, начиная от заданных в аргументах рабочих
каталогов переносится в выходной каталог. Опцией -h с указанием
файла конвертации путей можно изменить структуру выходных путей. Файл
конвертации путей должен состоять как минимум из двух строк для одной
замены и пяти строк для двух замен и так далее по 3 строки на замену:
подстрока для поиска в исходном пути на первой строке, строка замены,
которая будет подставлена вместо найденной подстроки поиска и пустая строка
или строка коментариев - разделительная третья строка. Строкой комментариев
считается строка с начальным символом #. Все пустые строки и строки с
коментариями игнорируются (любое количество), первые строки файла
конвертации путей также могут быть пустыми или строками коментариев. Самая
последняя разделительная строка не требуется.
Важно помнить, что:
- Поиск подстрок осуществляется полностью, начиная с последней в этом
файле конвертации и, как следствие, замен в общем случае может быть
несколько;
- Подстрока считается найденной, если это действительно имя каталога, а
не любая произвольная подстрока. В формате regex это означает, что
подстрока считается найденной, если удовлетворяет следующему регулярному
выражению: (^sub$)|(^sub/)|(/sub$)|(/sub/), где сама подстрока sub может
содержать любое количество подкаталогов (слешей);
- Начальный и конечный слеши в подстроке поиска не требуются, они
будут удалены, а поиск будет произведен по вышеуказаному регулярному
выражению алгоритмически;
- Имена файлов (без имён каталогов) в процессе конвертации путей не
участвуют.
- Строки поиска типа '/' или '//' и так далее бессмысленны и программа
завершится с ошибкой при детектировании такой ситуации.
Пример, который я был вынужден сделать для одной реальной задачи: если
входное имя файла находится в подкаталоге dirX, то необходимо удалить этот
подкаталог из пути, остальные имена подкаталогов оставить как есть. Файл
для опции -h должен содержать быть примерно таким:
# уничтожаем подкаталог dirX
dirX
.
# end
в результате входное имя work_dir/dirs1/dirX/dirs2/file будет
преобразовано в sendto_dir/dirs1/./dirs2/file, что эквивалентно
sendto_dir/dirs1/dirs2/file.
- -n ticks - время повторного сканирования рабочих каталогов, по умолчанию
20 секунд;
- При вызове с опцией -D, файлы и не удаляются, использовать
рекомендуется только для отладки.
- При вызове с опцией -R программа не создает подкаталоги при
переносе. Все необходимые подкаталоги должны быть ранее созданы в
sendto_dir. Данная опция возможно необходима при переносе на
файловую систему, где запрещено создавать каталоги, если при создания
каталога возвращается ошибка, отличная от "каталог существует" при его
наличии, например ftpfs с запретом создания подкаталогов. Удаление
подкаталогов осуществляется опцией -S.
- Опция -H hidename изменяет имя промежуточного файла на
указанный, каталог для промежуточного файла задается опцией -t, а если она
не указана, то используется имя каталога из обязательного параметра -s
sendto_dir. По умолчанию имя промежуточного файла: .hide.tmp.
Данная опция необходима при использовании нескольких программ tosser с
одним временным каталогом указанием разных имен временных файлов. Это важно
помнить, так как иначе на выходе будут файлы перемешаны из разных программ
вызова и разобрать эту путанницу будет практически невозможно.
- Опция -2 принудительно возобновляет пересканирование всех
рабочих каталогов после указанного времени в секундах. Данная опция
предназначена для преждевременного прекращения цикла перекладывания файлов
при медленной работе программы с сетевыми дисками и большим количеством
файлов и позволяет переложить файлы из более глубоких подкаталогов с
большим приоритетом, чем файлы с меньшей вложенности каталогов в рабочих
каталогах. Такое поведение программы по умолчанию происходит без
использования опций -X, -x и -y. Совместное использование с
указанными опциями так же имеет смысл, если необходим высокий приоритет с
прерыванием текущего цикла запомненых файлов для указанных этими опциями
сортировки и маски приоритета.
- Опция -E encode_str позволяет перекодировать символы имени
файла. Программа оперирует тремя именами файлов: входящее, внутреннее и
исходящее. Входящее имя используется только для операций чтения файлов из
входящих каталогов и их последующего удаления. Все основные операции
производятся с внутренним именем: записи в лог-файл, запись в архив,
сравнение масок для перекладывания, приоритезации и архивирования.
Исходящее имя создается из внутреннего с преобразованием пути: обработка
пропука каталогов (опция -S), преобразование пути (опция
-h) и подстановка выходного каталога в обязательной опции -s
sendto_dir. Опция -E позволяет осуществить перекодирование
символов входящего имени во внутреннее и имя после преобразования пути в
исходящее. Без этой опции, внутреннее имя соотвествует входящему без путей
входящих каталогов. Начало строки encode_str до символа 'o' указывает на
набор перекодирований входящего имени во внутреннее. Если преобразование
для внутреннего не требуется, то строку можно сразу начать с 'o'. Для
перекодирования из UTF-8 в koi-8 необходимо указать символ '8', для
обратной операции из koi8-r в UTF-8 необходимо указать символ '9', для
перекодирования из koi8-r в windows-1251 необходимо указать символ 'w', для
обратной операции из windows-1251 в koi8-r необходимо указать символ 'W',
для перекодирования одного символа в другой необходимо указать подстроки
"'?'-'?'" "OOO-OOO", "'?'-OOO" или "OOO-'?'", где ? - любой символ, OOO -
трехзначный восмеричный код входящего символа до знака минус и исходящего
символа. Для наглядности поддерживается разделитель ':'. Возможно
произвести такой набор как для внутреннего так и для исходящего имени:
набор перекодировок одиночных символов, цепочку
UTF-8→koi8-r→windows-1251 либо только koi8-r→windows-1251
или наоборот windows-1251→koi8-r→UTF-8 или только
koi8-r→UTF-8, а после еще один набор одиночных символов. Другой
порядок кодирования в строке -E перекодировок даст неопределенный
результат. Пустая строка перекодировок, в том числе конец строки после
символа 'o' считается ошибкой. Стоит помнить о необходимости экранирования
апострофов, так как этот символ обычно имеет специальное значение в
типичных интерпретаторах командных языков.
Например: -E 8:300-341:o:9 кодирует следующий порядок перекодировок:
входящее имя файла перекодируется из UTF-8 в кодировку koi8-r, далее символ
с кодом \0300 (буква 'ю') будет заменен на букву 'А'. Полученное внутреннее
имя будет использоваться для операций, описанных выше. Исходящее имя будет
перекодировано из внутреннего имени с преобразованием из koi8-r в UTF-8.
Пример плохой идеи использования: опция -E '/'-'_':'.'-000 означает перекодировать все слеши подкаталогов на символ подчеркивания и обрезать результирующее имя при нахождении первой точки. Исходящее имя будет создано из внутреннего без дополнительного перекодирования.
Так же опция -E устанавливает режим записи имени файла в лог-файле и в
отладочном выводе. По умолчанию внутреннее имя файла в логе отображается
относительно рабочих каталогов с добавлением номера каталога в квадратных
скобках из которого найден файл для перекладывания соответствующий номеру
рабочего каталога при вызове программы, но только при условии, что таких
каталогов при вызове было больше одного. Символ 'n' в опции -E включает добавление подстроки [1] к внутреннему имени при вызове с любым количеством
рабочих каталогов, а символ 'N' отключает добавления [номера] при вызове с
любым количеством рабочих каталогов. Конечный результат будет зависеть от
последнего символа в аргументе опции -E.
- Опция -S skip_first_dirs удаляет указанное колличество первых каталогов
из имени с относительным путём от рабочего каталога перед преобразованием
путей. Так же эта опция имеет два специальных значения: если
skip_first_dirs равно 0, то из рабочих каталогов считываются только файлы,
подкаталоги игнорируются; если skip_first_dirs равно -1, то происходит рекурсивное считывание всех подкаталогов, но из всех путей файлов удаляются
подкаталоги, то есть эмулируется ситуация, когда все найденные файлы лежат
как бы непосредственно в рабочих каталогах. В этих специальных режимах -S 0
и -S -1 невозможно производить изменния путей и, поэтому, при вызове с опцией -h будет завершение программы tosser с ошибкой. Например, если входящее имя есть
work_dir/dir1/dir2/file, то при вызове с опцией -S 1 исходящее
имя будет send_to/dir2/file.
- После подготовительных операций по проверке опций и запуску монитора,
программа устанавливает свое имя в системном списке процессов на имя вызова
программы без опций. Имя вызова можно сменить опцией -N имя_вызова. Это
удобно для мониторинга нескольких процессов перекидывания с разными опциями. Если не указана опция
-p pidfile, то создается /var/run/имя_вызова.pid.
- Опции -x или -X отсортировывают файлы перед перекидыванием по дате модификации, при использовании ключа
-x первыми будут перекладываться наиболее
старые файлы, а для -X - наиболее свежие файлы. Совместное использование
ключа -x и ключа -2 время_пересканирования имеет смысл, если возможно
помещение в рабочие каталоги файлов со старой датой модификации относительно уже имеющихся во время перекладывания или задано сортировать по приоритету ключом
-y маска_приоритета.
- Опция -y маска_приоритета выбирает внутренние имена файлов по указанной
маске, для перекидывания первыми. Совместное использованием с ключом -x или
-X работает так: вначале выбираются файлы, удовлетворяющие маске, потом
между ними происходит сортировка по дате модификации, после них перекладываются файлы не удовлетворяющие маске, также отсортированные по дате модификации. Если необходимо иметь очень высокий приоритет для указанных файлов, позволяющий прервать перекладывание файлов, не удовлетворяющих маске,
то необходимо использовать совместно с опцией -2.
- При вызове с опцией -O, программа в ситуции, когда в выходном пути уже
есть файл, с тем же именем, что и готовый для перекладывания из рабочих каталогов, удовлетворяющий указанной маски ksh-glob, перепишет его с предупреждением в лог-файле. Без этой опции файлы не перезаписываются, а при запуске с ключем
-1 программа завершится с ошибочным кодом возврата, при этом
в рабочих каталогах останутся файлы, которые либо были в выходном каталоге,
либо при чтении-записи возникли проблемы. Следует учесть, что проверяется
только имя файла, а содержимое проверяется только для архивных файлах с рабочим файлом, то есть содержимое имеющегося выходного файла значение не
имеет.
- При вызове с опцией -C программа проверяет все указанные рабочие каталоги work_dir...
на предмет отличия файловой системы от файловой системы выходного каталога -s sendto_dir.
Данная опция полезна, если есть вероятность
запуска программы при отмонтированной удаленной файловой системой и, если
эта ситуация выявится при запуске либо перезапуске демона перекладывания
при мониторинге, то программа вызовет скрипт из аргумента опции (см. ниже)
и завершится с ошибкой, а монитор будет перезапускать программу. Параметр
опции: время ожидания перед перезапуском - обязательное число больше нуля в
секундах и необязательная подстрока :script - программа-скрипт, которая будет вызвана перез завершением программы перекладывания с единственной опцией
-C. Данный скрипт должен быть указан либо по абсоютному пути либо лежать в каталогах, указанных в переменной среды PATH. Данная опция рекомендуется для вызова в режиме мониторинга, так как после выполнения скрипта
программа так же завершится. Код возврата будет равен 65. Скрипт, по идее,
должен либо прекратить вызов программы (см. ниже описание мониторинга), либо примонтировать удаленные файловые системы.
- Для возможности наблюдения за функционированием программы tosser, её
можно вызвать с опцией -i. При этом параметр опции определяет:
первое число до двоеточия - время перезапуска в секундах после предыдущего
завершения программы tosser с кодом возврата равного нулю, то есть
успешного завершения; второе число - время перезапуска в секундах после
предыдущего завершения программы tosser с кодом возврата неравного нулю, то
есть завершения с ошибкой или завершения по сигналу. Также после двоеточия
можно указать время ожидания сигналов от демона перекладывания tosser о его
работоспособности. По умолчанию это время равно двойному значению из опции
-n ticks. При этом в системе будет два процесса, которые будут
отражены в списке процессов с учетом опции -N name, где первый
процесс - монитор с опцией -i и второй - сама программа
перекладывания после текущего перезапуска. В файл -p pidfile будет
записан номер процесса монитора, который может управлять режимом
перезапуска программы перекладывания, получая сигналы SIGUSR1,
SIGTERM, SIGHUP. Сигнал SIGUSR1 должен посылать демону
монитора демон перекладывания, информировая о своей работоспособности.
Сигнал SIGTERM, посланный демону мониторинга пересылается демону
перекладывания и происходит ожидание его завершения. Перезапуск после этого
сигнала не производится. Сигнал SIGHUP работает аналогично cигналу
SIGTERM, но демону перекладывания посылается неперехватываемый
сигнал SIGKILL. Если за время heart_beat монитор не получил
сигнал SIGUSR1, он посылает демону перекидывания сигнал
SIGTERM, далее ожидает завершения демона перекладывания и
перезапускает его. Если и за следуещее время heart_beat демон
перекладывания не завершится и опция -k не указана, демону
перекладывания будет послан сигнал SIGKILL.
- Если указана опция -k, то при невозможности получить завершение процесса
перекладывания по окончанию времени heart_beat, монитор вызывает соответвующий скрипт с одной опцией -k и ожидает его завершения. В скрипте необходимо осуществить операции по принудительному завершению программы перекладывания, например послав сигнал SIGHUP демону мониторинга и необходимые другие действия, например восстановив работоспособность удаленных файловых
систем. Скрипт необходимо указывать либо из каталогов, перечисленных в переменной окружения PATH, либо по полному пути.
Стоит учесть, что демон перекладывания будет автоматически вызван с
ключем -1 и -f но без включения режима отладки. Для уменьшения засорения
лог-файлов сообщениями о пустых входящих каталогов и бесполезного рестарта,
рекомедуется вызывать программу tosser с мониторингом также с опциями -TI
- Опция -a включает архивирование, аргумент - каталог с архивом. В каталоге архива создаются подкаталоги ГГГГ/ММ/ДД/путь/файл, куда помещаются файлы
до их удаления из рабочих каталогов при их реальном помещении в исходящий
каталог. Если имя архивного файла уже есть в каталоге текущего дня, то к
имени файла дописывается суффикс .номер по порядку.
- При вызове с опцией -M archive_mask, файлы будут архивироваться только с
именами, удовлетворяющие указанной маске в формате ksh-glob (см описание в
конце этого файла). В маске могут содержаться подкаталоги, имя для сравнения используется после конвертации в внутреннее имя этой частью опции
-E, без преобразования опцией -h.
- Опция -A "строка" определяет режим архивирования. Без указания этой опции файлы в архив помещаются путем создания жестких ссылок (hardlink) на
получаемый в результате копирования промежуточный файл hidename во временном каталоге sendto_temp_dir, поэтому каталог архивирования должен быть на
той же файловой системе, что и выходной каталог. Если строка аргумента опции содержит символ 'l', то файлы в архив помещаются путем создания жестких
ссылок (hardlink) на исходные файлы, поэтому в этом режиме будет осуществлена проверка, что все указанные рабочие каталоги и каталог архива расположены на одной файловой системе. Если строка аргумента опции содержит символ
'c', то файлы в архив помещаются путем копирования. Без указания опции -A
"путь" файла (см. описание опции -a) соотвествует пути исходного файла от
конкретного рабочего каталога с этим файлом, возможно перекодированный в
соответствии с опцией -E для перекодирования в внутреннее имя. Конвертация
путей для архивирования в соответствии с опцией -h включается указанием в
опции -A символа 'h'. Имя "файла" в архиве также перекодируется в соответствии с опцией
-E для перекодирования в внутреннее имя. Без указания опции -A подкаталоги и имя файла для архивирования создаются принадлежащими
пользователю, от которого запущена программа перекладывания, имя пользователя для создания архива можно указать подстрокой "u=пользователь" опции
-A. Аргументы у опции -A при использовании кодирования с опцией u=user
рекомендуются разделять символом ':'. Например: -A u=archuser:c. Стоит
учесть, что при создании жестких ссылок хоть и используется привилегии указанного пользователя для записи в каталог архивирования, сам файл будет
иметь имя владельца исходного файла при указании аргумента 'l', а если не
указаны аргументы 'l' либо 'c', то имя владельца будет соответствовать указанному опцией вызова
-u uid (см ее описание), так как у всех жестких ссылок атрибуты файла идентичны. То есть, если необходимо явно указать владельца файла, используйте режим копирования, см. пример выше.
Программа перекладывания может производить сравнение файлов с имеющимися
в архиве. При нахождении файла совпадающего с любым, когда-либо помещенным
в архив по его содержимому вне зависимости от имени, производится дополнительная запись в лог файл в виде текущее_имя=имеющееся_имя, а в архиве будет создана символьная ссылка на имеющийся в архиве с именем найденого дубликата, который будет удален из рабочего каталога. Для этого программа создает базу данных архива с именем .crc_bd (необходимо первоначально вызвать
с опцией -c) в каталоге, указанном в аргументе опции -a. Для включения
сравнения и накопления информации в базе необходимо указать в аргументе опции -A символ 'C', а для запрета перекладывания файлов, содержимое которых
совпадает с любым, когда-либо помещенным в архив - дополнительно символ
'D'. Стоит учесть, что в архив попадают файлы и, соответственно, проверяются на уникальность при задании опции
-M только соотвествующие указанной маске.
Особенности работы при наличие в выходном каталоге файла с именем, соотвествующим готовому для перекладывания файла с учетом опций
-E -h -O и режимом архивации состоят в следующем. Если программа вызвана без режима
-A CD, то этот файл так же как и без режима архивации будет пропущен до момента когда его заберут с выходного каталога другие программы (в том числе и
другие программы перекладывания). Сравнение содержимого будет произведено
после того, как из выходного каталога файл "изчезнет". Если же программа
была вызвана с режимом -A CD, то произойдет проверка содержимого. Если содержимое эквивалентно какому-либо файлу в архиве, то далее программа будет
работать так же как и при отсутствии файла в выходном каталоге: в архиве
будет создана символьная ссылка на имеющийся файл, возможно с добавлением
суффикса, если имена совпадают с имеющимся в каталоге текущего дня, сам
файл будет удален из рабочего каталога, а в выходном каталоге изменений
программа производить не будет. Если содержимое не совпадает с файлами в
архиве, то только тогда в лог файл будет добавлена строка о уже существующем файле и программа будет пропускать перекидывание файла с таким же именем до "изчезновения" файла с этим именем из выходного каталога. Логика такой особенности в следующем: только в режиме
-A CD программа информирует о
наличии дубликата и создает симлинк с датой этого обнаружения, а также и не
допускает переноса дубликата в выходной каталог. Стоит помнить, что сравнение содержимого архива производится с файлом из рабочего каталога, а не с
файлом из выходного каталога.
- -c создать базу данных архива при первом запуске или неожиданной остановки с ее разрушением или после чистки архива для возможности включения
сравнения, данная опция должна быть вызвана с опцией -a archive_dir, а при
отсуствии опции -A mode, программа выдаст предупреждение, что по умолчанию
будет использоваться -A C режим - проверка на дубликаты, но с их перекладыванием. После пересканирования архива программа продолжит работу, для завершения работы программы после пересканирования архива добавте символ 'Q'
в параметр опции режима архивирования: -A Q.
Пересоздание базы данных и ее загрузка при старте программы (то есть без
опции -с) происходит до перехода программы в режим демона. Также не действует опция -M, в память программы загружается информация о всех файлах архива и при перекладывании будет действовать режим проверки для файлов, соотвествующих опции
-M уже со всеми ранее помещенными в архив файлами.
- При вызове с опцией -m mask, файлы будут выбраны только с
именами, удовлетворяющие указанной маске в формате ksh-glob. Маска
применяется к внутреннему имени файла (см. описании опции -E), то
есть без учета рабочего каталога.