首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从任何地方运行Perl代码(其中包括文件路径)

从任何地方运行Perl代码(其中包括文件路径)
EN

Stack Overflow用户
提问于 2017-01-27 11:16:23
回答 2查看 72关注 0票数 0

我正在使用perl创建一个守护进程,在任何地方运行脚本都有困难(如所需)。脚本将进程id写入文件中,并记录输出。下面的代码工作在下面,如果我试图更改它,例如,获取pwd并在我的文件夹命名之前插入它,我得到的错误是没有文件或目录,例如,我说$dir =pwd,然后将pid文件设置为$dir/pid/导体_daemon_test.pid。有什么想法吗?不管地点如何,如何让它运行?

代码语言:javascript
复制
#!/usr/bin/perl

use POSIX qw(setsid);
my $proc;
my $error;
my $file="conductor.pl";
my $pidfile=">./home/perl_daemon/conductor/pid/conductor_daemon_test.pid";
my$pid2check="/home/perl_daemon/conductor/pid/conductor_daemon_test.pid";
my $pid;

#Make it a daemon
$proc = Daemonize();

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

#Write Pid Information
if(!$error){
    if(-e $pid2check){
            LogMessage("$file : PID File $pid2check already exists. Exiting..");
            exit(0);
    }
    else {
            unless(open(FILE, $pidfile)){
                    $error = "Error opening file for writing ".$!;
            }
    }
    }
    if(!$error) {
    LogMessage("$file: PID $proc: Writing pid information to $pidfile");
    print FILE $proc ."\n";
    close(FILE);
     }

   my $EXIT = 0;
   $SIG{TERM} = sub{ LogMessage("Caught exit signal!\n");$EXIT=1};

   #Main loop of the Daemon
   while (!$error){

    sleep(100);
    LogMessage("Hello World");


    do { LogMessage("Graceful exit!\n"); exit } if $EXIT;

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

    LogMessage ("$file: PID $proc: END");enter code here

     exit(0);

     #
     #Subs
     #
     #####################################

     #       Daemonize
     #
     #####################################
     #
     #       Used to make this program a daemon
     #       Also to redirect STDIN, STDERR, STDOUT
    #       Returns PID
    #
    ########

sub Daemonize {
    #Ensure that the current directory is the working directory
    unless(chdir '/'){
            $error = "Can't chdir to /:$!";
    }
    #Ensure that the file mode mask is changed
    unless(umask 0){
            $error="Unable to umask 0";
    }
    #Ensure the STDIN is closed
    unless(open STDIN, '/dev/null'){
            $error="Can't read /dev/null:$!";
    }
    #All print statements will now be sent to our log file
    unless(open STDOUT, '>> /home/perl_daemon/conductor/log/conductor_daemon_test.log'){
            $error="Can't read /home/perl_daemon/conductor/log/conductor_daemon_test.log:$!";
    }
#All error messages will now be sent to our log file
    unless(open STDERR, '>>/home/perl_daemon/conductor/log/conductor_daemon_test.log'){
            $error="Can't write to /home/perl_daemon/conductor/log/conductor_daemon_test.log:$!";
    }

#Fork off the parent process
defined($pid = fork);
#Exit if $pid exists(parent)
exit(0) if $pid;

#As Child
#Create a new SID for the child process
setsid();
$proc = $$;
return($proc);
}


####
#
#       Log Message
#
#       Used to log messages
#
######

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-27 11:27:27

在尝试使用pwd时,似乎没有创建'pid‘子目录。在尝试创建pid文件之前创建它。

另外:请使用词法文件句柄和3个参数形式的open:open (my $fh, '>', $filename),而不是GLOBs (FILE)和'>filename.pid'

票数 0
EN

Stack Overflow用户

发布于 2017-01-27 12:05:17

使用作为核心模块的FindBin,您可以轻松找到脚本的位置:

描述 定位到脚本bin目录的完整路径,以允许相对于bin目录使用路径。

我的建议是,您可以为您的脚本创建一个模式,这样您就可以将所有内容放在同一个文件夹中,如下所示:

代码语言:javascript
复制
daemon/script.pl
daemon/pid/ <- pid files
daemon/log/ <- logs 

所以你的代码是这样的:

代码语言:javascript
复制
use FindBin qw($RealBin);

my $pidfile=">.$RealBin/pid/conductor_daemon_test.pid";
my $pid2check="$RealBin/pid/conductor_daemon_test.pid";

您可以导出以下变量:

可出口变量 $Bin - bin目录的路径,从其中调用脚本的$Script - basename,从该脚本调用$RealBin - $Bin,所有链接解析为$RealScript - $Script,并解析所有链接。

然后我想你就不会再对位置有任何问题了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41892720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档