Назад | Перейти на главную страницу

Кто-нибудь знает, где найти примеры демонов?

Я никогда раньше не писал демона, и я пытаюсь написать довольно сложный демон, который должен подключаться к базе данных MYSQL, чтобы увидеть, пора ли (или уже давно) выполнить поиск по ftp, а затем попытаться получить некоторые файлы ftp если время подходящее. Затем ему необходимо импортировать данные ftp в базу данных MYSQL и, наконец, обновить несколько связанных таблиц MYSQL. Затем, конечно же, подождите и вернитесь назад.

Я вообще пишу на php. Синтаксис C для меня не проблема с точки зрения прямого программирования, но прошло так много времени, что я понятия не имел, какие инструменты и библиотеки были бы предпочтительны для решения таких задач.

Я ищу несколько примеров рабочих демонов, которые делают больше, чем просто записывают в файл журнала. В частности, мне нравится видеть, как кто-то получил рабочий демон для получения ftp-файла и запроса и / или обновления базы данных MYSQL. Мне любопытно, как люди обрабатывают ошибки и какие объекты они используют для обработки вызовов базы данных и передачи файлов.

Я использую сервер Ubuntu 10.04.

Спасибо за внимание.

должен подключиться к базе данных MYSQL, чтобы узнать, пришло ли время (или уже давно) выполнить поиск по ftp

Почему бы не использовать для этой задачи простую cronjob? таким образом, вы все еще можете сделать это на php, он не будет работать полный рабочий день, а вместо этого будет планировать время, которое вы хотите, с помощью cronjob и, вероятно, сэкономит ваши ресурсы.

Из руководства php.net:

<?php

$pid = '/tmp/my_code_pid';
if (file_exist("$pid")) { # to prevent your code from running 
    echo "Proccess already running.";# when another instance is already running
    exit;
}

touch($pid); # create the pid file

// define some variables
$local_file = 'local.zip';
$server_file = 'server.zip';

// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// try to download $server_file and save to $local_file
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
    echo "Successfully written to $local_file\n";
} else {
    echo "There was a problem\n";
}

// close the connection
ftp_close($conn_id);

// Do your mysql things

unlink("$pid") if (file_exist("$pid")); # erase the pid file once the runtime is complete
?>

Теперь, чтобы ваше правило cronjob запускалось каждые 5 минут, например:

*/5 * * * * /usr/bin/php /home/my_user/my_code.php 1> /dev/null

НОТА: Использовать whereis php чтобы убедиться, что ваш путь php

Чтобы установить указанное выше расписание, выполните:

crontab -e

Как только он попадает в редактор (при условии, что ваш редактор по умолчанию - VI), тип:

:$ и нажмите ENTER, это переместит вас к последней строке файла

o переведет вас в текстовый режим для следующей строки, которая будет новой строкой

esc заставит вас выйти из текстового режима, чтобы вы могли сохранить файл

:wq и нажмите ENTER для сохранения и выхода из редактора

:q! и нажмите ENTER, если вы допустили ошибку, которая завершится без сохранения изменений.

Демон обычно определяется как длительная задача, которая выполняется в «фоновом режиме», а не под прямым контролем пользователя. Для программиста это означает:

  1. у него есть цикл, который, вероятно, имеет какую-то задержку или ожидание, поэтому он будет «долгим». Так что положив while (!file_exist("/tmp/mydaemon_killswitch")) { перед кодом и sleep($timeperiod); } после того, как код в каком-то смысле сделает его демоном.

  2. он «разветвляется и умирает», чтобы отделиться от tty. Обратите внимание, что другой способ смоделировать это из командной строки - войти в систему, выполнить «nohup $ yourprog &» и выйти из системы. $ yourprog не умрет, но управляющий tty отключится и продолжит работать в «фоновом режиме».