我以前从未编写过守护进程,现在我想编写一个相当复杂的守护进程,它必须连接到 MYSQL 数据库,以查看是否到了执行 ftp 检索的时间(或已过时间),然后尝试检索一些 ftp 文件(如果时间合适)。然后它需要将 ftp 数据导入 MYSQL 数据库,最后更新几个关联的 MYSQL 表。然后当然是等待并循环回来。
我一般用php写。就直接编码而言,C语法对我来说没有问题,但时间太长了,我不知道用什么工具和库来处理这样的任务比较好。
我正在寻找一些可以正常工作的守护进程的示例,这些守护进程的作用不只是写入日志文件。具体来说,我想看看有人如何让一个可以正常工作的守护进程检索 ftp 文件并查询和/或更新 MYSQL 数据库。我很好奇人们如何处理错误,以及他们使用什么样的对象来处理数据库调用和文件传输。
我正在使用 10.04 Ubuntu 服务器。
谢谢您的考虑。
答案1
守护进程通常被定义为在“后台”运行的长时间运行的任务,不受用户的直接控制。对于程序员来说,这基本上意味着:
它有一个循环,可能存在某种延迟或等待,因此最终会“长时间运行”。因此,
while (!file_exist("/tmp/mydaemon_killswitch")) {
在代码之前和sleep($timeperiod); }
之后放置一个,在某种意义上,会使其成为守护进程。它执行“fork off and die”来与 tty 断开连接。请注意,从命令行模拟此操作的另一种方法是登录,执行“nohup $yourprog & ”,然后注销。$yourprog 不会死,但控制 tty 会消失,它会继续在“后台”运行。
答案2
必须连接到 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 键,系统将退出而不保存更改。