有人知道在哪里可以找到一些示例守护进程吗?

有人知道在哪里可以找到一些示例守护进程吗?

我以前从未编写过守护进程,现在我想编写一个相当复杂的守护进程,它必须连接到 MYSQL 数据库,以查看是否到了执行 ftp 检索的时间(或已过时间),然后尝试检索一些 ftp 文件(如果时间合适)。然后它需要将 ftp 数据导入 MYSQL 数据库,最后更新几个关联的 MYSQL 表。然后当然是等待并循环回来。

我一般用php写。就直接编码而言,C语法对我来说没有问题,但时间太长了,我不知道用什么工具和库来处理这样的任务比较好。

我正在寻找一些可以正常工作的守护进程的示例,这些守护进程的作用不只是写入日志文件。具体来说,我想看看有人如何让一个可以正常工作的守护进程检索 ftp 文件并查询和/或更新 MYSQL 数据库。我很好奇人们如何处理错误,以及他们使用什么样的对象来处理数据库调用和文件传输。

我正在使用 10.04 Ubuntu 服务器。

谢谢您的考虑。

答案1

守护进程通常被定义为在“后台”运行的长时间运行的任务,不受用户的直接控制。对于程序员来说,这基本上意味着:

  1. 它有一个循环,可能存在某种延迟或等待,因此最终会“长时间运行”。因此, while (!file_exist("/tmp/mydaemon_killswitch")) { 在代码之前和 sleep($timeperiod); } 之后放置一个,在某种意义上,会使其成为守护进程。

  2. 它执行“fork off and die”来与 tty 断开连接。请注意,从命令行模拟此操作的另一种方法是登录,执行“nohup $yourprog & ”,然后注销。$yourprog 不会死,但控制 tty 会消失,它会继续在“后台”运行。

答案2

必须连接到 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 键,系统将退出而不保存更改。

相关内容