Создать демон на Ubuntu 16.04

13

Я разработал сканер на PHP, который анализирует URL с конкретными заголовками и помещает все URL контента в очередь. Работает нормально.

Я разработал этот код в Ubuntu 14.04 и поместил файл .conf в папку / etc / init со следующим содержимым:

# Info
description "Warm the varnish to get the list of products"
author      "Juanjo Aguilella"

# Events
start on startup
stop on shutdown

# Automatically respawn
respawn
respawn limit 100 5

# Run the script
# Note, in this example, if your PHP script return
# the string "ERROR", the daemon will stop itself.
script
    [ $(exec /usr/bin/php -f /var/www/crawler.php) = 'ERROR' ] && ( stop; exit 1; )  
end script

Он отлично работает в Ubuntu 14.04, и я могу запускать и останавливать демон, используя «sudo service crawler start» и «sudo service crawler stop»

Теперь в производственной среде у меня есть сервер Ubuntu 16.04, и я помещаю тот же код в ту же папку, но когда я пытаюсь запустить службу, я получаю сообщение «Не удалось запустить crawler.service. Unit crawler.service not found»

Можете ли вы помочь мне с этим?

С уважением

Хуанхо Агилелла Марес
источник
Отсутствует исполняемый файл php в / usr / bin / php? Проверьте журналы, у вас будет некоторая информация
Дом
2
Ubuntu 16.04 использует systemd. Узнайте, как это работает, и сделайте crawler.service.
Halfgaar

Ответы:

15

Добавляя к ответу @Juanjo Aguilella Marés, и после того, как вы скопировали / связали свой скрипт /etc/systemd/system, вы можете автоматически запустить его при запуске сервера:

sudo systemctl daemon-reload
sudo systemctl enable my_service.service
sudo systemctl start my_service.service

Источник Digital Ocean

Это также хорошая идея, чтобы не запускать его от имени пользователя root. Просто измените userстроку в вашем скрипте:

[Service]
User=some_user
Andres
источник
12

Я решил проблему:

а) Создайте файл crawler.service в / etc / systemd / system с этим кодом:

[Unit]
Description=Crawler cache Service
After=network.target

[Service]
User=root
Restart=always
Type=forking
ExecStart=/var/www/execute.sh

[Install]
WantedBy=multi-user.target

Мой bash-файл содержит различные исполнения, параллельные одному и тому же php-файлу с этим кодом:

#!/bin/sh
php /var/www/tiendas.local.mediamarkt.es/crawler.php
sleep 0.1
{
    php /var/www/tiendas.local.mediamarkt.es/crawler.php
}&
sleep 0.2
{
    php /var/www/tiendas.local.mediamarkt.es/crawler.php
}&
sleep 0.3
{
    php /var/www/tiendas.local.mediamarkt.es/crawler.php
}&
sleep 0.4
{
    php /var/www/tiendas.local.mediamarkt.es/crawler.php
}

сон между исполнениями необходим для того, чтобы избежать проблемы с быстрым выполнением сервиса.

Если у вас есть какие-либо предложения по поводу решения, пожалуйста, прокомментируйте, у меня нет большого опыта работы с bash-файлами и файлами systemd, но на данный момент работает нормально.

Хуанхо Агилелла Марес
источник
4

1]. Для создания сервиса перейдите в / etc / systemd / system /

2]. Создайте файл serviceName, например, chatSocket.service

3]. Поместите содержимое в файл, как указано ниже

[Unit]
Description=Your PHP Daemon Service
#Requires=mysqld.service memcached.service #May your script needs mysql or other services to run.
#After=mysqld.service memcached.service

[Service]
User=root
Type=simple
TimeoutSec=0
PIDFile=/var/run/server.pid
ExecStart=/usr/bin/php -f /home/shrikant/workspace/app/Http/Controllers/server.php  2>&1> /dev/null #path to script
#ExecStop=/bin/kill -HUP $MAINPID
#ExecReload=/bin/kill -HUP $MAINPID
KillMode=process

Restart=on-failure
RestartSec=42s

StandardOutput=null #If you don't want to make toms of logs you can set it null if you sent a file or some other options it will send all php output to this one.
StandardError=/home/shrikant/workspace/app/Http/Controllers/chatSocket.log #path to error log file
[Install]
WantedBy=default.target

4]. Перезагрузите конфигурацию, нажав:

sudo systemctl daemon-reload

5]. Включите службу по умолчанию, чтобы при запуске системы служба запускалась автоматически:

sudo systemctl enable my_service.service

6]. Запустите свой сервис, используя команду ниже:

sudo systemctl start my_service.service

Shree29
источник