Я только что обновил CentOS 6.5 до 7.0, и я не слишком доволен, потому что новое systemd
, вероятно, доставляет мне проблемы. Кажется, это просто слишком быстрая загрузка, асинхронный запуск процессов и разрушение служебных зависимостей.
Например, у меня есть несколько скриптов, crond
которые запускаются после перезагрузки:
@reboot /root/scripts/check_gmail.sh
@reboot /root/scripts/start_gps_listener.sh
Это приводит к всевозможным странным ошибкам (показывает только одну из них):
Warning: stream_socket_client(): unable to connect to tcp://192.168.20.4:4001
(Network is unreachable) in /root/scripts/check_gmail.php on line 137
ERROR: Network is unreachable (101)
Выше я пишу в сокет TCP. Для меня довольно ясно, что crond
запускается до того, как сеть должным образом инициализируется как network is unreachable
.
То же самое относится и к Apache и MySQL (MariaDB). MySQL довольно медленно запускается (много данных), что означает, что и Apache, и многие мои crond
скрипты запуска не работают, поскольку база данных MySQL не работает во время вызова скриптов.
Я пытался настроить зависимости, но безуспешно; Я добавил network
и mysql
услуги [Unit]
(как видно с systemctl list-dependencies
). В идеале все сервисы ждут, пока MySQL будет запущен:
vi /lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target network.service mysql.service
vi /lib/systemd/system/crond.service
[Unit]
Description=Command Scheduler
After=syslog.target auditd.service systemd-user-sessions.service time-sync.target network.service mysql.service
При загрузке с вышеупомянутым я получаю те же ошибки. Я также получаю электронные письма, так mailq
как сеть / DNS не готова при обработке cron-скриптов. Через несколько минут после запуска они отправляются правильно.
Может ли кто-нибудь помочь сделать это правильно, убедившись, что службы работают в правильном порядке? Кажется очень неправильным, что это такая быстрая загрузка, и в идеале это было сделано по старому доброму пути: «запуск одной услуги ... ожидание ... запуск новой службы ... ожидание ... и так далее).
Обратите внимание, что я не уверен, systemd
что это моя проблема - это всего лишь моя теория о том, что я могу прочитать из сети.
grep -i concurrency /etc/default/rcS
? Возможно, я путаю мои системы инициализации, но, похоже, я помню, что контролирует, ожидают ли процессы завершения друг друга./etc/default/rc*
Requires=network.target
к единицам выше.Requires=network.target
в/lib/systemd/system/crond.service
Ответы:
После гораздо большего чтения я нашел решение, которое работает для меня.
Я прочитал это руководство, Запуск сервисов после запуска сети . Небольшая цитата из руководства:
Это именно то, что я хотел, поэтому я включил эту службу и установил правило зависимости в файле службы для
crond
:Поскольку
mysqld
все еще основано на старом,init.d
мне нужно было создатьsystemd
сервис, как предложено здесь, включение systemctl отличается от запуска systemctl :И, наконец, настройте службу Apache на запуск после MySQL:
Это работает для меня по крайней мере.
Я использовал эти команды, чтобы потом проверить, где я ясно вижу, что сеть запущена, по крайней мере, до MySQL и Apache. Я
crond
нигде не вижу, но вижу, что это работает в моих скриптах:Несколько других полезных команд, которые я использовал:
Если кто-нибудь может найти лучший способ сделать это, пожалуйста, поделитесь.
источник
systemd-analyze critical-chain
. Мало того, что я собираюсь использовать это часто, но я внезапно проданsystemd
. Спасибо!