Incrond работает, но не выполняет команды CentOS 6.4

Я скопировал этот вопрос сюда из StackOverflow...

Я установил incron из репозитория EPEL (0.5.9) (перед тем, как вы спросите; ДА, я также попытался загрузить исходный код и скомпилировать его локально (0.5.10); те же результаты) и пытаюсь настроить процесс на моем CentOS 6.4 (последний) виртуальный ящик, который я успешно прототипировал на своей локальной машине Ubuntu 12.04 (процесс включает в себя incron отлично работает под Ubuntu):

Некоторая информация заранее:

  • SELinux настроен РАЗРЕШИТЕЛЬНО (я также пытался ОТКЛЮЧИТЬ, кажется, нет никакой разницы!)
  • Я добавил свои сценарии и вызвал исполняемые файлы для всех, используя NOPASSWD, используя visudo чтобы обойти некоторые проблемы с разрешениями...
  • Я попытался применить политику для incron, как описано здесь http://blog.siphos.be/2013/05/a-selinux-policy-for-incron-finishing-up/ но я продолжаю получать

    libsepol.policydb_read: policydb magic number 0x696c6f70 does not match expected magic number 0xf97cff8c or 0xf97cff8d semodule_package: Error while reading policy module from incron.te

    когда я пытаюсь использовать semodule_package

  • Я попытался определить среду как в самом сценарии, так и в предварительном сценарии caller.sh делая это, я могу env > /tmp/envfile.txt который указывает, что сценарий выполняется в клоне sudo env (как я и предполагал), однако я все еще не получаю вывод из своего скрипта, ни работу, которую он должен делать со своим входным файлом, ни каким-либо из его журналов...

  • это должны быть разрешения, верно? (Я еще на один день от этого просто chmod -r 777 в корневой файловой системе;))

  • Под Ubuntu 12.04 простое действие sudo incrotab -e и входя /tmp/ IN_CREATE,IN_NO_LOOP env > /home/username/envfile.txt показывает, что incron уже запущен в среде root / sudo, как и предполагает документация incron.

  • Это все, что связано с SELinux, или что-то еще происходит в CentOS, что делает это настолько трудным?

Если я вызову свой сценарий из командной строки с sudo /path/to/my/script.sh arguments Отлично работает.

или в этом отношении, если я призываю caller.sh все работает нормально, но когда caller.sh вызывается incrond это то же самое, не могу даже env > /dev/pts/0 от него. (хотя я могу env > /tmp/envfile.txt

sudo service incrond status проверяет, что incrond работает. root и myusername добавляются в /etc/incron.allow, /etc/incron.deny пустой.

нижеследующее устарело, см. пункты выше, но прочитайте его для предыстории и расширения...

Мой incrotab для root:

/path/to/dropfolder/ IN_CLOSE_WRITE sudo /path/to/my/script.sh $@/$#

События в /path/to/dropfolder/ результат НИЧЕГО полезного не происходит. журналы создаются в / var / log / cron, сообщений нет, никаких действий с файлами в папке не происходит.

Итак, я исследовал: было предложено cron работает в минимальной среде и что для выполнения сложных команд / сценариев вам может потребоваться выполнить .bashrc и / или экспортируйте свой PATH в начале команды cron.

Изменить: документация указывает, что incron запуск из системных таблиц или root берет env из среды своего хоста, поэтому только incron Выполнение пользователями без прав root должно требовать каких-либо действий env или PATH

Итак... incrontab для root:

/path/to/dropfolder IN_CLOSE_WRITE . /home/myusername/.bashrc; export PATH=$PATH:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin; sudo /path/to/my/script.sh $@/$#"

Нет кости... попробовал && вместо ; = без кубиков. Если вы можете придумать вариант выше, я, вероятно, попробовал это...

Итак, давайте попробуем немного restorecond -R /usr/sbin/incrond /etc/incron* действие! Да, там тоже никаких изменений. service incrond stop с последующим service incrond start а потом service incrond restart... Нет, нет и нет.

Решительные меры: yum remove incron а также yum install incron, chkconfig incrond on а затем для хорошей меры sudo reboot!

как насчет старого touch ./autorelabel и перезагрузка? Нету!

Ничего такого.

Я даже ничего не получаю от /tmp/ IN_ALL_EVENTS echo boo> > /home/myusername/boofile.txt отсюда моя неспособность даже сделать env > envfile.txt проверить, incron работает в редких условиях... (см. примечание выше)

И все еще: service incrond status доходность incrond (pid xxxx) is running...

дальнейшее изучение /var/log/cron дает такие результаты: Aug 14 15:05:30 hostname incrond[1584]: (root) CMD (sudo /path/to/DropFolder/script/subfolder/script-Beta-1.sh /home/username/DropFolder/testfile.file) -да, я убедился, что мой сценарий был исполняемым..

если я устанавливаю incrontab для root, чтобы содержать /tmp/ IN_ALL_EVENTS,IN_NO_LOOP env > /tmp/envfile.txt Я ничего не получаю. хвост /var/log/cron содержит: Aug 15 10:06:32 hostname incrond[1584]: (root) CMD (env > /tmp/envfile.txt) но файл не существует в /tmp/

так что incrond действительно пытается что-то сделать, но я не получаю вывод нигде... даже echo > /dev/pts/0 дает нада результаты.

если я сделаю рут incrontab/tmp/ IN_ALL_EVENTS,IN_NO_LOOP . ./home/print/.bashrc; env > /tmp/envfile.txt как было предложено в нескольких темах, которые я нашел касающимися cron проблемы окружающей среды я получаю Aug 15 12:30:25 hostname incrond[1726]: cannot exec process: Permission denied pid здесь он отличается от того, в котором утверждается, что он выдал команду, поэтому здесь явно происходит порождение дочернего процесса... это было упомянуто в ссылке на политику SELinux выше, и я чувствую, что они связаны, но не должны быть PREMISSIVE и DISABLED Настройки SELinux не заботятся об этом??

прежде чем я попытался установить SELinux на DISABLED, я получал записи в /var/log/audit/audit.log что указывало на то, что incron пытался что-то делать, и они были захвачены res=success в конце... что, кажется, указывает на то, что SELinux позволил чему-то случиться, но ничего не происходит! После установки SELinux на DISABLED и обратно на PERMISSIVE и перезагрузки (несколько раз) я не получаю никаких записей в /var/log/audit/audit.log связанные с incrond помимо service start и тому подобное. WTH?


Я попробовал все вышеописанные тактики incron как root (sudo incrontab), как обычный пользователь, и хотя системные таблицы (расположены в /etc/incron.d) с теми же результатами:p

Я бросил кухонную раковину в это (насколько я понимаю содержимое раковины), и я не могу найти решение... Чего мне не хватает? Я надеюсь, что кто-то может заставить меня почувствовать себя идиотом в короткие сроки!

4 ответа

Решение

Хорошо, вот ответ:

Несмотря на всю документацию, я могу найти заявление об обратном, incrond под CentOS 6.4 работает в разреженной среде и ведет себя как cron, Это не относится к Ubuntu, где incron наследует свою среду от root для системных таблиц и корневых таблиц, и только пользовательские таблицы работают в разреженной среде. Это, конечно, означает, что если вы вызываете сценарий (я), сценарий должен создать свою среду, и каждая вещь должна иметь полный путь. ВСЕ. (ну, кроме встроенных оболочек:p)

многочисленные поиски в Google, Bing, Stack Overflow и сбоях в серверах, все говорили мне, что cron работает таким образом, но все они, казалось, также указывают на то, что incron работает как описано в документации, что он делает под Ubuntu...

Итог, теперь это работает, ура!

  • Я предполагаю, что это показывает, что если вы сомневаетесь, определите среду и используйте полные пути... на самом деле, просто делайте это все время и избавьте себя от головной боли.

(это не решает мою проблему с применением политики безопасности SELinux для incron, но об этом я буду беспокоиться позже, в другом посте...)

Я была такая же проблема. После многих проб и ошибок я обнаружил, что моя оригинальная линия

/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand $@/$#

не работает, но работает следующее:

/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#

Я предполагаю, что incron не соблюдает сценарии с помощью шебанга (пока?) И нуждается в переводчике внутри команды.

редактировать: после небольшого тестирования я обнаружил, что если команда представляет собой скрипт (bash или shell), ей потребуется расширение.sh, или перед ним должен стоять интерпретатор, такой как /bin/sh. Таким образом, следующие примеры будут работать (по крайней мере, под CentOS 6.4)

/path/to/watch IN_CLOSE_WRITE /bin/sh /usr/local/bin/mycommand $@/$#
/path/to/watch IN_CLOSE_WRITE /usr/local/bin/mycommand.sh $@/$#

Из-за недостаточной репутации мой вклад приходит как отдельный ответ, а не как комментарий пользователя 1990990.

Да, OP говорит, что CentOS, но для людей Ubuntu, я также должен был придерживаться sudo -u my_user_name перед bin/sh немного. Итак, линия становится

/path/to/watch IN_CLOSE_WRITE sudo -u my_user_name /bin/sh /usr/local/bin/mycommand $@/$#

Сообщение incrond: cannot exec process: Permission denied

Попробуйте добавить разрешение x в сценарий, который будет выполнен (это разрешение могло быть "удалено" ftp, sftp, так далее.)

chmod +x /srv/datadisk01/your/incron_script.sh
Другие вопросы по тегам