0

如何在打开后立即获取进程的 pid。比如说我们运行 ./file.pl 然后 ./file2.pl 因为这两个文件都会在 /proc/ 文件夹中创建一个 pid。如何在运行可执行文件时立即知道进程是否已创建。我有一个包含所有命令的文件,一旦它收到 /proc/ 文件夹中有新进程的绿色信号,就可以立即运行。我怎么做?编辑:请不要用 shell 命令回答。我不需要知道pid。我需要开发一个脚本,它可以立即知道我们在 proc 部门有一位客人

4

4 回答 4

1

如果您通过 shell 启动进程,则在后台启动进程:

./your_prog &

获取 pid:

echo $!
于 2013-08-07T20:18:22.103 回答
0

试试下面的 shell 脚本。(您可能必须在下面的脚本中包含更改以获得预期的输出)

#!/bin/bash
nr_proc_before=`ls -l /proc | wc -l`
ls /proc > proc_list_before

./any_executable &

nr_proc_after=`ls -l /proc | wc -l`
ls /proc > proc_list_after
nr_new=`expr $nr_proc_after - $nr_proc_before`

echo "$nr_new processes are created newly"
echo "new processes pids are :"
diff proc_list_after proc_list_before > new_pids
sed "1d" new_pids

if [ nr_new > 0 ] ; then
   #trigger your file which has commands.
fi

你可以用你的东西替换any_execuatble,以便创建新的进程。

注意:这不是监视新进程的脚本。此脚本示例可能会为您提供解决问题的想法。请回复这个答案,我可以重新定义我的答案。

于 2013-08-08T10:53:38.750 回答
0

每个进程都可以通过getpid(2)系统调用获得自己的 pid 。在fork(2)创建进程时,父进程(例如一些 shell)获取新子进程的 pid。阅读高级 Linux 编程等更多信息。并且内核(不是程序)在创建pid 1234 的进程后立即创建一些子目录,/proc/1234/请参见proc(5) 。

其实,/proc/并不是真正的文件系统。它只是一个伪文件系统,可以查看内核和整个 Linux 系统的状态。

Perl 为您提供了它的POSIX模块来接口系统调用。系统getpid()调用使用$PID$$Perl 变量进行接口。

伪文件系统由/proc/内核填充。您也许可以使用inotify来跟踪变化,/proc/但这很可能是个坏主意。

您的问题不清楚,我们无法理解您真正想要做什么以及您尝试过什么。

于 2013-08-08T04:58:44.750 回答
0

如果脚本返回 shell 提示,您可以执行以下操作:

./your_prog
pidof -x your_prog

使用此 perl 脚本测试正常:

#!/usr/bin/perl

if (fork() == 0) {
    sleep(600);
}

你需要

chmod +x your_prog

前...

于 2013-08-07T20:47:52.357 回答