Incrontab не выполняет команду

Вопрос или проблема

Когда я использую incrontab в “из коробки”, не внося изменений, я не получаю никакого результата, будто команда не была выполнена.

Моя строка incron выглядит так:
/crrae IN_CREATE,IN_CLOSE_WRITE,IN_MOVED_TO /usr/bin/unix2dos $#

Лог показывает информацию, будто всё в порядке, но на самом деле нет.

Сгенерированный strace выглядит так: incrontab_trace_0.txt

 0.000000 poll([{fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLIN}], 3, -1) = 1 ([{fd=8, revents=POLLIN}])
17.616276 read(8, "\1\0\0\0\0\1\0\0\0\0\0\0000\0\0\0ExportSageJDE_CO"..., 32768) = 64
 0.000145 stat64("/crrae", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
 0.000147 time(NULL)                = 1399228077
 0.000056 stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=156, ...}) = 0
 0.000089 stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=156, ...}) = 0
 0.000082 stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=156, ...}) = 0
 0.000096 send(3, "<78>May  4 18:27:57 incrond[3183"..., 108, MSG_NOSIGNAL) = 108
 0.000104 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f60718) = 31838
 0.000816 poll([{fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLIN}], 3, -1) = -1 EINTR (Interrupted system call)
 0.000834 --- SIGCHLD (Child exited) @ 0 (0) ---
 0.000033 read(4, 0x8069c40, 32)    = -1 EAGAIN (Resource temporarily unavailable)
 0.000057 write(5, "X", 1)          = 1
 0.000056 sigreturn()               = ? (mask now [])
 0.000072 poll([{fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLIN}], 3, -1) = 1 ([{fd=4, revents=POLLIN}])
 0.000068 read(4, "X", 1)           = 1
 0.000054 read(4, 0xbfd22dd9, 1)    = -1 EAGAIN (Resource temporarily unavailable)
 0.000057 waitpid(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], WNOHANG) = 31838
 0.000060 waitpid(-1, 0xbfd22dd4, WNOHANG) = -1 ECHILD (No child processes)
 0.000051 poll([{fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLIN}], 3, -1) = 1 ([{fd=8, revents=POLLIN}])
 0.009198 read(8, "\1\0\0\0\10\0\0\0\0\0\0\0000\0\0\0ExportSageJDE_CO"..., 32768) = 64
 0.000074 stat64("/crrae", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
 0.000118 time(NULL)                = 1399228077
 0.000057 stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=156, ...}) = 0
 0.000084 stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=156, ...}) = 0
 0.000082 stat64("/etc/localtime", {st_mode=S_IFREG|0644, st_size=156, ...}) = 0
 0.000090 send(3, "<78>May  4 18:27:57 incrond[3183"..., 108, MSG_NOSIGNAL) = 108
 0.000065 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f60718) = 31839
 0.000614 poll([{fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLIN}], 3, -1) = -1 EINTR (Interrupted system call)
 0.000832 --- SIGCHLD (Child exited) @ 0 (0) ---
 0.000026 read(4, 0x8069c40, 32)    = -1 EAGAIN (Resource temporarily unavailable)
 0.000055 write(5, "X", 1)          = 1
 0.000054 sigreturn()               = ? (mask now [])
 0.000071 poll([{fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLIN}], 3, -1) = 1 ([{fd=4, revents=POLLIN}])
 0.000067 read(4, "X", 1)           = 1
 0.000053 read(4, 0xbfd22dd9, 1)    = -1 EAGAIN (Resource temporarily unavailable)
 0.000051 waitpid(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], WNOHANG) = 31839
 0.000058 waitpid(-1, 0xbfd22dd4, WNOHANG) = -1 ECHILD (No child processes)
 0.000050 poll([{fd=4, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLIN}], 3, -1 <unfinished ...>

Когда я изменяю мой incron на:

/crrae IN_CREATE,IN_CLOSE_WRITE,IN_MOVED_TO /usr/bin/unix2dos /crrae/$# 

или

/crrae IN_CREATE,IN_CLOSE_WRITE,IN_MOVED_TO /usr/bin/unix2dos $@/$#

лог показывает мне это:

May  4 18:15:10 srvovs incrond[20859]: (root) CMD (/usr/bin/unix2dos /crrae/u2dtmpPbqoFd)
May  4 18:15:10 srvovs incrond[20859]: (root) CMD (/usr/bin/unix2dos /crrae/u2dtmpN2Odxf)
May  4 18:15:10 srvovs incrond[20859]: (root) CMD (/usr/bin/unix2dos /crrae/u2dtmpN2Odxf)

множество раз, файл incron.conf не был изменён.
Есть идеи?

Запуск команды (unix2dos), которая записывает в файл и закрывает его на основе события CLOSE_WRITE, известен как “цикл”. incrontab имеет встроенные защиты против зацикливания.

Может быть, вам стоит попробовать выяснить, что, когда и почему incron выполняет действия.

#!/bin/bash

echo "[$( date )] $*" >>/tmp/myincronlog

и добавить $% к аргументам incrontab.

Учитывая, что вы предоставляете только один аргумент своей команде, это подразумевает, что он модифицирует файл на месте. Это приводит к тому, что действие incron создаст события incron. Хотя incrond попытается обработать такие ситуации, но только если вы сообщите ему с помощью IN_NO_LOOP. Но лучше избежать появления проблемы, не модифицируя целевой файл в действии incron таким образом, который вызовет incron.

Ответ или решение

Проблема с выполнением команды в incrontab: Анализ и Решение

Введение

Когда вы используете incrontab для автоматизации обработки файлов в определённых директориях, столкновения с проблемами выполнения команд могут привести к значительным затруднениям в рабочем процессе. В данном документе мы проанализируем вашу проблему с выполнением команды unix2dos в incrontab и предложим рекомендации по устранению возникших ошибок.

Описание Проблемы

Вы указали в вашем incrontab следующую строку:

/crrae IN_CREATE,IN_CLOSE_WRITE,IN_MOVED_TO /usr/bin/unix2dos $#

Однако, несмотря на отсутствие ошибок в логах, команда не выполняется. При изменении строки на:

/crrae IN_CREATE,IN_CLOSE_WRITE,IN_MOVED_TO /usr/bin/unix2dos /crrae/$#

вы получаете сообщения о том, что команда была выполнена, но вызов unix2dos приводит к созданию новых событий, что может вызвать бесконечный цикл из-за повторной обработки файла. Это было подтверждено данными, полученными с помощью strace.

Анализ Логов и Поведенческих Моделей

Логи, которые вы представили, указывают на то, что команда выполняется, но каждая обработка файла приводит к созданию нового события. incron встроен с механизмом защиты от зацикливания команд, что может объяснять отсутствие ожидаемого результата при использовании первичной строки incrontab.

Функция unix2dos, выполняемая на файле, который уже обрабатывается incron, может вызывать дополнительные события IN_CLOSE_WRITE, что, в свою очередь, приводит к вновь созданным триггерным событиям. Этот эффект возможен, если команда изменяет файл на месте.

Рекомендации по Решению

  1. Изменение Команды: Избегайте изменения файла внутри той же команды, которая вызывает событие. Вместо этого, используйте временные файлы. Например:

    /crrae IN_CREATE,IN_CLOSE_WRITE,IN_MOVED_TO /usr/bin/unix2dos /crrae/$# /crrae/temp_file && mv /crrae/temp_file /crrae/$#
  2. Использование опции IN_NO_LOOP: Если ваша версия incron поддерживает эту опцию, попробуйте добавить её:

    /crrae IN_CREATE,IN_CLOSE_WRITE,IN_MOVED_TO /usr/bin/unix2dos $% IN_NO_LOOP
  3. Логирование Действий: Установите механизм логирования перед вызовом команды, чтобы отслеживать, какие именно события происходят и когда:

    #!/bin/bash
    echo "[$(date)] Command executed with args: $*" >> /tmp/myincronlog
    /usr/bin/unix2dos "$@"
  4. Изучите Другие Методы Обработки Файлов: Возможно, использование других инструментов (например, inotifywait) для мониторинга изменений в каталоге и обработки файлов с использованием сценариев будет менее проблематичным.

Заключение

Проблемы с выполнением команд в incrontab могут быть вызваны множеством факторов, включая триггерные события и циклические вызовы. Предложенные изменения и анализ помогут устранить проблему и оптимизировать обработку файлов. Если возникнут дополнительные сложности, рекомендуем обратиться к документации incron или сообществу для получения более детальных рекомендаций.

SEO Оптимизация

Постарайтесь использовать ключевые слова, такие как "incrontab не выполняет команду", "unix2dos в incron", и "устранение проблем с incrontab", чтобы улучшить видимость данной информации в поисковых системах.

Оцените материал
Добавить комментарий

Капча загружается...