0

假设我有一个 perl 脚本,它一直在后台运行,比如说 run.pl 我如何通过调用它来与这个脚本进行交互?如:perl run.pl -reload , perl run.pl -reset

有可能做到吗?如果是,我应该学习哪个模块?

非常感谢!

4

3 回答 3

2

IPC ( perldoc perlipc)可以通过多种方法完成:

  1. 使用套接字
  2. 使用信号
  3. 使用共享内存

我认为最简单的方法是在脚本中处理信号 HUP,在收到信号后,读取一些文件以获取更多信息。当然,您必须在发送信号之前编写此文件。

于 2012-07-30T08:15:21.990 回答
1

操作系统中有多种进程间通信方法(在 Linux/Unix 的情况下,这是管道、FIFO、信号、共享内存等)。Perl 支持所有这些。

我认为,您的任务的最佳解决方案是使用信号。

所以你可以在 Perl 中截取一个信号:

sub INT_handler {
    print("Don't Interrupt!\n");
}

$SIG{'INT'} = 'INT_handler';

所以你可以发送信号:

kill  9     => $pid;                    # send $pid a signal 9
kill -1     => $pgrp;                   # send whole job a signal 1
kill  USR1  => $$;                      # send myself a SIGUSR1
kill  HUP   => @pids;                   # send a SIGHUP to processes in @pids

更多关于学习 Perl中的信号的信息,第 16.8 章发送和接收信号

操作系统中可用的信号不多(最多 64 个),可用于自己目的的信号更少。

如果您需要更强大的功能,请使用套接字或消息传递系统,例如ZeroMQ

于 2012-07-30T08:15:51.867 回答
0

由于您的 perl 脚本在后台运行,您可以直接与其交互。但是,解决方法很少:

  1. 文件。您可以将文件用作某些操作的触发器。想象一下,你有一份 run.pl 在后台运行,它不断检查文件 /tmp/file 的存在。如果它不存在,则脚本将继续检查,如果不存在,则将脚本设置为您想要的任何内容。有些如果你的命令“perl run.pl -reload”会创建这个文件,你会得到你想要的。
  2. 信号。您可以向进程发送信号。如何在 perl 脚本中使用信号,请参见此处
于 2012-07-30T08:15:55.043 回答