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