linux - 在 Linux 中启动和停止 Perl 守护进程

标签 linux perl daemon

我一直在为 linux 开发一个 perl 守护进程,这是它的框架:

#!/usr/bin/env perl
use File::Copy;
use Socket;
use Sys::Hostname;
use POSIX qw(setsid);
use Env;

use Sys::Info::Constants qw( :device_cpu );

my $daemonName = 'proc';

my $proc;
my $error;
my $file = "Proc.pl";
my $pidfile = ">/var/run/proc.pid";
my $pid2check = "/var/run/proc.pid";
my $pid;


if (!$error) {
    LogMessage("$daemonName  : PID $proc : Begin");
}

if (!$error) {
    LogMessage("$daemonName  : PID $proc : Writing pid information to $pidfile");
    print FILE $proc . "\n";
    close (FILE);
}

$SLEEP_TIME = 5; # seconds

#Main loop of Daemon
while (!$error) {
    sleep($SLEEP_TIME);

}


if ($error) {
    LogMessage("$file : PID $proc : Error $error");
}

LogMessage("$file : PID $proc : END");

exit(0);


sub Daemonize {

if (!(chdir '/')) {
    $error .= "Can't chdir to /: $!";
}
if (!(umask 0)) {
    $error .= "Unable to umask 0";
}

unless (open STDIN, '/dev/null') {
    $error .= "Can't read /dev/null: $!";
}

open(OLD_OUT,">&STDOUT");  

#All print statments will now be sent to our log file
unless (open STDOUT, '>>/var/log/proc.log') {
    $error .= "Can't read /var/log/proc.log: $!";
}
#All error messages will now be sent to our log file
unless (open STDERR, '>>/var/log/proc.log') {
    $error .= "Can't write to /var/log/proc.log: $!";
}

defined($pid = fork);
#Exit if $pid exists (parent)

if ($pid)
{
    print OLD_OUT "Service successfully installed.\n";
    exit(0);
}

#As Child
setsid();
$proc = $$;
return ($proc);
 }


#Prints log messages
sub LogMessage {
my $message = $_[0];
print localtime() . " $message\n";
}

我对 perl 比较陌生,我想知道启动和停止这个守护进程的最简单方法是什么?另外,我将如何检查以确保没有它的实例已经在运行?

最佳答案

一般来说,守护进程是通过 double fork 完成的方法。这是常见的习语,有libraries为您执行此操作,您应该考虑使用。 pid 或锁定文件通常用于确保一次只有一个实例运行。

如果您打算将其用作系统进程,也可以使用类似 upstart 的东西或 supervisord为您做流程管理和“一次只有一个”的事情。

关于linux - 在 Linux 中启动和停止 Perl 守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6439654/

相关文章:

linux - 为什么 sklearn 中的核心事件在时间 RFECV/LogisticRegression 后减少

regex - 如何替换字符串并保留其大写/小写

ruby-on-rails - rails : How to stop background job of daemonized sidekiq in Ubuntu

c++ - 当应用程序成为守护进程时,Valgrind 退出

c++ - 使用 execv 从 C++ 启动服务

linux - 监听Socket并复制到另一个端口

linux - 我想用 sed 编辑器更改文本

linux - SaltStack U 盘部署

perl - 从需要的 perl 脚本访问 sub

mysql - 转换器 Perl 脚本修复