代码之家  ›  专栏  ›  技术社区  ›  sebastian nielsen

perl:Launch process with system(),然后检查它是否在特定的显示号下运行

  •  0
  • sebastian nielsen  · 技术社区  · 14 年前

    我有一个锁定的“信息亭”终端服务器。

    这个终端服务器有一个perl脚本作为它的.Xsession,并启动一个Tk接口。当Tk接口完成时,perl脚本启动“process2”,并允许用户与“process2”(图形应用程序)交互。

    如果用户篡改了“process2”,并使其崩溃,则用户可能能够访问底层桌面,因此我想检查“process2”是否正在运行,如果“process2”没有在$display上运行,则我只想执行注销(这将注销perl脚本当前运行的显示)。

    由于系统同时向10个不同的用户运行10个“process2”实例,我不能只检查“process2”是否在带有“ps”或类似内容的系统上运行。我需要检查“process2”是否在特定的display$display下运行。 注意,所有10个用户在所有会话中都以相同的用户名登录,因此我无法检查由特定用户运行的所有进程,这也将返回所有10个实例。

    比如:

    system("process2 &");
    while(1) {
      sleep(1);
      if (is_it_running("process2", $display) == false) {
        system("logout &");
      }
    }
    

    它的功能是“正在运行”,我需要知道它应该是什么样子。 $display可以包含原始显示编号,如:“1.0”,也可以包含解析出来的显示编号,如“1”。

    3 回复  |  直到 14 年前
        1
  •  3
  •   aschepler    14 年前

    如果你使用 fork exec 而不是 system("...&") ,您可以存储子进程的进程ID,并更直接地检查其状态。另见 perlipc .

        2
  •  1
  •   zigdon    14 年前

    为什么不直接跑 process2 在前面?然后你的Perl脚本在执行完成之前不会得到控制,此时它可以退出:

    system("process2");
    system("logout");
    

    当然,如果这是整个脚本,那么bash脚本可能更有意义。

        3
  •  0
  •   sebastian nielsen    14 年前

    我试了很多次才解决的。

    一根管子打开了吗

    $pidofcall = open(HANDLE, "process2|");
    

    然后我做了我需要做的一切,我让服务器在失去与process2的连接时向我发送一个信号。如果我真的需要爆炸,我只是做了一个“goto killprocess”;然后我只是:

    killprocess:
    kill(9,$pidofcall);
    close(HANDLE);
    $mw->destroy;
    system("logout");