在 ubuntu 16.04 上创建守护进程

在 ubuntu 16.04 上创建守护进程

我用 PHP 开发了一个爬虫,它可以解析具有特定标头的 URL,并将所有内容的 URL 放入队列中。它工作正常。

我在 ubuntu 14.04 中开发了此代码,并在 /etc/init 文件夹中放置了一个包含以下内容的 .conf 文件:

# 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。未找到单元 crawler.service”

您能给我一些帮助吗?

问候

答案1

添加到@Juanjo Aguilella Marés 答案,一旦您将脚本复制/链接到/etc/systemd/system,您可能希望在服务器启动时自动启动它:

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

来源数字海洋

最好不要以 root 身份运行它。只需更改user脚本中的以下行:

[Service]
User=some_user

答案2

我解决了这个问题:

a) 使用以下代码在 /etc/systemd/system 中创建文件 crawler.service:

[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 文件没有太多经验,但目前运行良好。

答案3

14.04 的 init 系统是 upstart。16.04 的 init 系统是 systemd。你应该将您的 upstart 脚本转换为 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

相关内容