我用 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