Я никогда раньше не писал демона, и я пытаюсь написать довольно сложный демон, который должен подключаться к базе данных MYSQL, чтобы увидеть, пора ли (или уже давно) выполнить поиск по ftp, а затем попытаться получить некоторые файлы ftp если время подходящее. Затем ему необходимо импортировать данные ftp в базу данных MYSQL и, наконец, обновить несколько связанных таблиц MYSQL. Затем, конечно же, подождите и вернитесь назад.
Я вообще пишу на php. Синтаксис C для меня не проблема с точки зрения прямого программирования, но прошло так много времени, что я понятия не имел, какие инструменты и библиотеки были бы предпочтительны для решения таких задач.
Я ищу несколько примеров рабочих демонов, которые делают больше, чем просто записывают в файл журнала. В частности, мне нравится видеть, как кто-то получил рабочий демон для получения ftp-файла и запроса и / или обновления базы данных MYSQL. Мне любопытно, как люди обрабатывают ошибки и какие объекты они используют для обработки вызовов базы данных и передачи файлов.
Я использую сервер Ubuntu 10.04.
Спасибо за внимание.
должен подключиться к базе данных MYSQL, чтобы узнать, пришло ли время (или уже давно) выполнить поиск по ftp
Почему бы не использовать для этой задачи простую cronjob? таким образом, вы все еще можете сделать это на php, он не будет работать полный рабочий день, а вместо этого будет планировать время, которое вы хотите, с помощью cronjob и, вероятно, сэкономит ваши ресурсы.
<?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, если вы допустили ошибку, которая завершится без сохранения изменений.
Демон обычно определяется как длительная задача, которая выполняется в «фоновом режиме», а не под прямым контролем пользователя. Для программиста это означает:
у него есть цикл, который, вероятно, имеет какую-то задержку или ожидание, поэтому он будет «долгим». Так что положив while (!file_exist("/tmp/mydaemon_killswitch")) {
перед кодом и sleep($timeperiod); }
после того, как код в каком-то смысле сделает его демоном.
он «разветвляется и умирает», чтобы отделиться от tty. Обратите внимание, что другой способ смоделировать это из командной строки - войти в систему, выполнить «nohup $ yourprog &» и выйти из системы. $ yourprog не умрет, но управляющий tty отключится и продолжит работать в «фоновом режиме».