如何在打开后立即获取进程的 pid。比如说我们运行 ./file.pl 然后 ./file2.pl 因为这两个文件都会在 /proc/ 文件夹中创建一个 pid。如何在运行可执行文件时立即知道进程是否已创建。我有一个包含所有命令的文件,一旦它收到 /proc/ 文件夹中有新进程的绿色信号,就可以立即运行。我怎么做?编辑:请不要用 shell 命令回答。我不需要知道pid。我需要开发一个脚本,它可以立即知道我们在 proc 部门有一位客人
4 回答
如果您通过 shell 启动进程,则在后台启动进程:
./your_prog &
获取 pid:
echo $!
试试下面的 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,以便创建新的进程。
注意:这不是监视新进程的脚本。此脚本示例可能会为您提供解决问题的想法。请回复这个答案,我可以重新定义我的答案。
每个进程都可以通过getpid(2)系统调用获得自己的 pid 。在fork(2)创建进程时,父进程(例如一些 shell)获取新子进程的 pid。阅读高级 Linux 编程等更多信息。并且内核(不是程序)在创建pid 1234 的进程后立即创建一些子目录,/proc/1234/
请参见proc(5) 。
其实,/proc/
并不是真正的文件系统。它只是一个伪文件系统,可以查看内核和整个 Linux 系统的状态。
Perl 为您提供了它的POSIX模块来接口系统调用。系统getpid()
调用使用$PID或$$
Perl 变量进行接口。
伪文件系统由/proc/
内核填充。您也许可以使用inotify来跟踪变化,/proc/
但这很可能是个坏主意。
您的问题不清楚,我们无法理解您真正想要做什么以及您尝试过什么。
如果脚本返回 shell 提示,您可以执行以下操作:
./your_prog
pidof -x your_prog
使用此 perl 脚本测试正常:
#!/usr/bin/perl
if (fork() == 0) {
sleep(600);
}
你需要
chmod +x your_prog
前...