Я пытаюсь запустить php-скрипт как демон в Debian. Я также хотел бы, чтобы он начинался с загрузки.Запуск скрипта PHP как Daemon в Debian
Я начал использовать /path/to/php /path/to/script/Insert.php &
без проблем, а также может shell_exec("nohup /path/to/php /path/to/script/Insert.php >/dev/null &")
. Я попытался использовать сценарий ниже, но сценарий не переходит в рабочее состояние.
Копирование файла на /etc/init.d/
и использование update-rc.d
без проблем. Я могу использовать service congen-insert start
, чтобы «запустить» скрипт, но он, похоже, не работает, и он не начинает выполнять какую-либо работу.
Что мне не хватает или где я ошибся со сценариями?
Я знаю, что есть несколько способов обойти это, но я просто пытаюсь понять, что я делаю неправильно или почему то, что я делаю, не работает.
Любая помощь или предложения очень ценится! Если в моем описании есть что-то еще, что вам нужно или что-то, что я пропустил, сообщите мне, чтобы я мог его исправить.
Заранее спасибо.
Сервис скрипт
#! /bin/sh
### BEGIN INIT INFO
# Provides: congen-insert
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: congen-insert
# Description: DB Insert Daemon
### END INIT INFO
NAME="congen-insert"
DESC=" DB Insert Daemon"
PIDFILE="/var/run/${NAME}.pid"
LOGFILE="/var/log/${NAME}.log"
DAEMON="/path/to/php"
DAEMON_OPTS="/path/to/script/Insert.php"
START_OPTS="--start --background --make-pidfile --pidfile ${PIDFILE} --exec ${DAEMON} ${DAEMON_OPTS}"
STOP_OPTS="--stop --pidfile ${PIDFILE}"
test -x $DAEMON || exit 0
set -e
case "$1" in
start)
echo -n "Starting ${DESC}: "
start-stop-daemon $START_OPTS >> $LOGFILE
echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon $STOP_OPTS
echo "$NAME."
rm -f $PIDFILE
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon $STOP_OPTS
sleep 1
start-stop-daemon $START_OPTS >> $LOGFILE
echo "$NAME."
;;
status)
echo -n "Sorry, this isn't implemented yet"
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
сценария Я пытаюсь запустить:
const LoaderPath = __DIR__ . DIRECTORY_SEPARATOR . ".." .DIRECTORY_SEPARATOR . "includes.php";
require_once LoaderPath;
use PhpAmqpLib\Channel\AMQPChannel;
use PhpAmqpLib\Message\AMQPMessage;
use requests\InsertRequest;
$connection = GetRabbitConnection();
$channel = $connection->channel();
$RedisClient = GetRedisClient();
DeclareQueues($connection, $RedisClient);
$MySQLHost = $RedisClient->get(MySQLHostKey);
$MySQLUser = $RedisClient->get(MySQLUserKey);
$MySQLPassword = $RedisClient->get(MySQLPasswordKey);
$MySQLDatabase = $RedisClient->get(MySQLDatabaseKey);
$InsertExchange = $RedisClient->get(Insert.":".Exchange);
$InsertQueue = $RedisClient->get(Insert.":".Queue);
$Prefetch = $RedisClient->get(Insert.":".Prefetch);
$RedisClient->disconnect();
$RedisClient = null;
$mysql= new mysqli($MySQLHost, $MySQLUser, $MySQLPassword, $MySQLDatabase);
$channel->basic_qos(0,$Prefetch,false);
$channel->basic_consume($InsertQueue, $InsertExchange, false, false, false, false, "callback");
echo "Consuming on Exchange $InsertExchange with Queue $InsertQueue\n";
while(true) {
$channel->wait();
}
$channel->close();
function callback(AMQPMessage $message){
global $mysql;
echo "Message received", "\n";
$InsertRequest = new InsertRequest($message->body);
echo "Running Insert Statement\n";
if (!$mysql->query($InsertRequest->SQL)){
echo "Error: ".$mysql->error;
}
/** @type AMQPChannel $channel */
$channel = $message->delivery_info['channel'];
$channel->basic_ack($message->delivery_info['delivery_tag']);
echo "Insert Complete\n";
}
Задача хрон не работает как сервис, т.е. обеспечение файл Pid, работает на старте, делая перезагружается и т.д. демон должен действовать, как и любой другой демон или сервера извне. – ChaosAffe
Вы можете установить сценарий для запуска при запуске системы: запуск при запуске; задача; exec/path/to/command; См. Более подробно на: http://askubuntu.com/questions/814/how-to-run-scripts-on-start-up – Zon
Я отредактировал вопрос, чтобы уточнить. Я не ищу обходных решений, а понимал. Спасибо за ваш альтернативный метод, хотя – ChaosAffe