perl:使用system()启动进程,然后检查它是否在特定的显示编号下运行

perl:使用system()启动进程,然后检查它是否在特定的显示编号下运行,perl,process,system,Perl,Process,System,我有一个锁定的“信息亭”终端服务器 这个终端服务器有一个perl脚本作为其.Xsession,并启动一个Tk接口。完成Tk接口后,perl脚本启动“process2”,并允许用户与“process2”(图形应用程序)交互 如果用户篡改了“process2”并使其崩溃,用户可能能够访问底层桌面,因此我想检查“process2”是否正在运行,如果“process2”没有在$display上运行,我只想执行注销(这将注销perl脚本当前运行的显示) 由于系统同时向10个不同的用户运行10个“proce

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

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

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

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

比如:

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

为什么不在前台运行
process2
?然后,您的perl脚本在执行完毕之前无法获得控制权,此时它可以退出:

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

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

为什么不在前台运行
process2
?然后,您的perl脚本在执行完毕之前无法获得控制权,此时它可以退出:

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

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

如果您使用and而不是
系统(“…&”)
,则可以存储子进程的进程ID,并更直接地检查它们的状态。另请参见。

如果使用和而不是
系统(“…&”)
,则可以存储子进程的进程ID,并更直接地检查其状态。另请参见。

经过多次尝试,我终于解决了这个问题

一根管子开了吗

$pidofcall = open(HANDLE, "process2|");
然后我做了我需要做的一切,我让服务器在与process2失去连接时向我发送一个信号。如果我真的需要爆炸,我只是做了一个“goto killprocess”;然后我就有了:

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

经过多次尝试,我终于解决了这个问题

一根管子开了吗

$pidofcall = open(HANDLE, "process2|");
然后我做了我需要做的一切,我让服务器在与process2失去连接时向我发送一个信号。如果我真的需要爆炸,我只是做了一个“goto killprocess”;然后我就有了:

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

Zigdon:不,那不行,因为perl脚本需要在执行process2之后和注销之前进行操作。perl脚本的作用是锁定键盘和鼠标,然后执行process2(这是一个连接到服务器的封闭源代码程序)。然后它轮询服务器并检查process2是否已连接,然后在process2已连接时解锁键盘。然后它需要检查process2是否死亡,然后它应该执行“注销”。Zigdon:不,这不起作用,因为perl脚本需要在执行process2之后和注销之前进行操作。perl脚本的作用是锁定键盘和鼠标,然后执行process2(这是一个连接到服务器的封闭源代码程序). 然后它轮询服务器并检查process2是否已连接,然后在process2已连接时解锁键盘。然后它需要检查进程2是否死亡,然后它应该执行“注销”。我真的不喜欢这个解决方案。据我所知,fork有在系统中积累“僵尸进程”的风险,这将浪费资源。想一想,如果服务器在某个星期内经常无人值守地从系统中使用,会发生什么情况,服务器将充满僵尸进程。我真的不喜欢这种解决方案。据我所知,fork有在系统中积累“僵尸进程”的风险,这将浪费资源。试想一下,当服务器在某个星期内经常无人值守地从系统中使用时,会发生什么情况,服务器将充满僵尸进程。