2019-11-21 20:07:44 skh2015java 阅读数 27
  • Linux系统编程、网络编程》第5章 进程控制

    课程内容: 进程与程序、进程PID与三个特殊进程、fork函数的作用、父子进程对文件的共享、execve加载函数、system函数、进程的资源回收、wait函数、进程状态、java进程、进程关系、守护进程,return/exit/_exit、环境变量表、环境变量API、C程序的内存空间布局、C库。

    271 人正在学习 去看看 张先凤

以下通过两种方法来根据进程名称获取pid

 

方法一

最简单的方法是使用 pidof 命令

用法:pidof  process_name

 

示例

官网的详细用法如下:

NAME
       pidof -- find the process ID of a running program.

SYNOPSIS
       pidof [-s] [-c] [-n] [-x] [-m] [-o omitpid[,omitpid..]]  [-o omitpid[,omitpid..]..]  program [program..]

DESCRIPTION
       Pidof finds the process id's (pids) of the named programs. It prints those id's on the standard output. This program is on some systems used in run-level change scripts, especially when
       the system has a System-V like rc structure. In that case these scripts are located in /etc/rc?.d, where ? is the runlevel. If the system has a start-stop-daemon (8) program that should
       be used instead.

OPTIONS
       -s     Single shot - this instructs the program to only return one pid.

       -c     Only  return  process ids that are running with the same root directory.  This option is ignored for non-root users, as they will be unable to check the current root directory of
              processes they do not own.

       -n     Avoid stat(2) system function call on all binaries which are located on network based file systems like NFS.  Instead of using this option the the variable PIDOF_NETFS may be set
              and exported.

       -x     Scripts too - this causes the program to also return process id's of shells running the named scripts.

       -o omitpid
              Tells  pidof  to omit processes with that process id. The special pid %PPID can be used to name the parent process of the pidof program, in other words the calling shell or shell
              script.

       -m     When used with -o, will also omit any processes that have the same argv[0] and argv[1] as any explicitly omitted process ids. This can be used to  avoid  multiple  shell  scripts
              concurrently calling pidof returning each other's pids.

EXIT STATUS
       0      At least one program was found with the requested name.

       1      No program was found with the requested name.

NOTES
       pidof is actually the same program as killall5; the program behaves according to the name under which it is called.

       When pidof is invoked with a full pathname to the program it should find the pid of, it is reasonably safe. Otherwise it is possible that it returns pids of running programs that happen
       to have the same name as the program you're after but are actually other programs. Note that that the executable name of running processes is calculated with  readlink(2),  so  symbolic
       links to executables will also match.

 

方法二

可以使用ps命令

ps -fC process_name

 

过滤出pid

ps -fC process_name | sed '1d' | awk '{print $2}'

 

 

一个简单的脚本测试一下一上两种方法【脚本名称:pid.sh】

#!/bin/bash


if [ $# -ne 1 ]
then
        echo "Usage : sh pid.sh  process_name"
        exit 1
fi

PID=`pidof $1`

if [ -n "$PID" ]
then
        echo "$1 pid is $PID"
else
        echo "$1 process is not running!"
fi


echo "======================================="


PID=`ps -fC $1 | sed '1d' | awk '{print $2}'`

if [ -n "$PID" ]
then
        echo "$1 pid is $PID"
else
        echo "$1 process is not running!"
fi

exit 0

 

sh pid.sh mysqld

2015-12-15 15:55:57 myccsdn 阅读数 1453
  • Linux系统编程、网络编程》第5章 进程控制

    课程内容: 进程与程序、进程PID与三个特殊进程、fork函数的作用、父子进程对文件的共享、execve加载函数、system函数、进程的资源回收、wait函数、进程状态、java进程、进程关系、守护进程,return/exit/_exit、环境变量表、环境变量API、C程序的内存空间布局、C库。

    271 人正在学习 去看看 张先凤

linux 根据进程ID获取对应进程的信息 

ps -u --pid 8012(pid)

2014-04-09 13:49:34 bzhxuexi 阅读数 7796
  • Linux系统编程、网络编程》第5章 进程控制

    课程内容: 进程与程序、进程PID与三个特殊进程、fork函数的作用、父子进程对文件的共享、execve加载函数、system函数、进程的资源回收、wait函数、进程状态、java进程、进程关系、守护进程,return/exit/_exit、环境变量表、环境变量API、C程序的内存空间布局、C库。

    271 人正在学习 去看看 张先凤

根据PID获取进程名&根据进程名获取PID

Liunx中 通过进程名查找进程PID可以通过 pidof [进程名] 来查找。反过来 ,相同通过PID查找进程名则没有相关命令。
在linux根目录中,有一个/proc的VFS(虚拟文件系统),系统当前运行的所有进程都对应于该目录下的一个 以进程PID命名的文件夹 ,其中存放进程运行的N多信息。其中有一个status文件,cat显示该文件, 第一行的Name 即为进程名。

 

打开stardict程序,进程名为stardict;

shell中分别根据Pid获取进程名、根据进程名获取Pid

1)查找stardict的pid:pidof stardict

2)根据1)的pid查找进程名: grep "Name:" /proc/5884/status

 

应用:kill一个进程需要指定该进程的pid,所以我们需要先根据进程名找到pid,然后再kill;

   killall命令则只需要给定进程名即可,应该是封装了这个过程。

 

C程序中实现上述过程

复制代码
 1 #include <sys/types.h>
 2 #include <dirent.h>
 3 #include <stdio.h>
 4 #include <string.h>
 5 
 6 #define BUF_SIZE 1024
 7 
 8 void getPidByName(char* task_name)
 9 {
10     DIR *dir;
11     struct dirent *ptr;
12     FILE *fp;
13     char filepath[50];//大小随意,能装下cmdline文件的路径即可
14     char cur_task_name[50];//大小随意,能装下要识别的命令行文本即可
15     char buf[BUF_SIZE];
16     dir = opendir("/proc"); //打开路径
17     if (NULL != dir)
18     {
19         while ((ptr = readdir(dir)) != NULL) //循环读取路径下的每一个文件/文件夹
20         {
21             //如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过
22             if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))             
            continue; 23 if (DT_DIR != ptr->d_type) 24       continue; 25 26 sprintf(filepath, "/proc/%s/status", ptr->d_name);//生成要读取的文件的路径 27 fp = fopen(filepath, "r");//打开文件 28 if (NULL != fp) 29 { 30 if( fgets(buf, BUF_SIZE-1, fp)== NULL ){ 31     fclose(fp); 32     continue; 33      } 34     sscanf(buf, "%*s %s", cur_task_name); 35 36 //如果文件内容满足要求则打印路径的名字(即进程的PID) 37 if (!strcmp(task_name, cur_task_name)) 38      printf("PID: %s\n", ptr->d_name); 39 fclose(fp); 40 } 41 42 } 43 closedir(dir);//关闭路径 44 } 45 } 46 47 void getNameByPid(pid_t pid, char *task_name) { 48 char proc_pid_path[BUF_SIZE]; 49 char buf[BUF_SIZE]; 50 51 sprintf(proc_pid_path, "/proc/%d/status", pid); 52 FILE* fp = fopen(proc_pid_path, "r"); 53 if(NULL != fp){ 54 if( fgets(buf, BUF_SIZE-1, fp)== NULL ){ 55 fclose(fp); 56 } 57 fclose(fp); 58 sscanf(buf, "%*s %s", task_name); 59 } 60 } 61 62 void main(int argc, char** argv) 63 { 64 char task_name[50]; 65 pid_t pid = getpid(); 66 67 printf("pid of this process:%d\n", pid); 68 getNameByPid(pid, task_name); 69 70 /* 71 strcpy(task_name, argv[0]+2); 72 printf("task name is %s\n", task_name); 73 getPidByName(task_name); 74 */ 75 printf("task name is %s\n", task_name); 76 getPidByName(task_name); 77 sleep(15); 78 }
复制代码

运行结果:

 

进入/proc/9674/status查看文件内容,一切对应。

Name: test
State: S (sleeping)
Tgid: 9674
Pid: 9674
PPid: 7438
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 24 27 30 46 112 124 1000 
VmPeak: 4340 kB
VmSize: 4336 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 600 kB
VmRSS: 600 kB
VmData: 184 kB
VmStk: 136 kB
VmExe: 4 kB
VmLib: 1920 kB
VmPTE: 32 kB
VmSwap: 0 kB
Threads: 1
SigQ: 0/15776
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000001fffffffff
Seccomp: 0
Cpus_allowed: f
Cpus_allowed_list: 0-3
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 1
nonvoluntary_ctxt_switches: 4

2017-11-18 13:57:12 baidu_33850454 阅读数 35294
  • Linux系统编程、网络编程》第5章 进程控制

    课程内容: 进程与程序、进程PID与三个特殊进程、fork函数的作用、父子进程对文件的共享、execve加载函数、system函数、进程的资源回收、wait函数、进程状态、java进程、进程关系、守护进程,return/exit/_exit、环境变量表、环境变量API、C程序的内存空间布局、C库。

    271 人正在学习 去看看 张先凤

导读

Linux 的交互式 Shell 与 Shell 脚本存在一定的差异,主要是由于后者存在一个独立的运行进程,因此在获取进程 pid 上二者也有所区别。

交互式 Bash Shell 获取进程 pid

在已知进程名(name)的前提下,交互式 Shell 获取进程 pid 有很多种方法,典型的通过 grep 获取 pid 的方法为(这里添加 -v grep是为了避免匹配到 grep 进程):

ps -ef | grep "name" | grep -v grep | awk '{print $2}'

或者不使用 grep(这里名称首字母加[]的目的是为了避免匹配到 awk 自身的进程):

ps -ef | awk '/[n]ame/{print $2}'

如果只使用 x 参数的话则 pid 应该位于第一位:

ps x | awk '/[n]ame/{print $1}'

最简单的方法是使用 pgrep:

pgrep -f name

如果需要查找到 pid 之后 kill 掉该进程,还可以使用 pkill:

pkill -f name

如果是可执行程序的话,可以直接使用 pidof

pidof name

Bash Shell 脚本获取进程 pid

根据进程名获取进程 pid
在使用 Shell 脚本获取进程 pid 时,如果直接使用上述命令,会出现多个 pid 结果,例如

#! /bin/bash
# process-monitor.sh
process=$1
pid=$(ps x | grep $process | grep -v grep | awk '{print $1}')
echo $pid

执行 process-monitor.sh 会出现多个结果:

$> sh process-monitor.sh
3036  3098  3099

进一步排查可以发现,多出来的几个进程实际上是子 Shell 的(临时)进程:

root      3036  2905  0 09:03 pts/1    00:00:45 /usr/java/jdk1.7.0_71/bin/java ...name
root      4522  2905  0 16:12 pts/1    00:00:00 sh process-monitor.sh name
root      4523  4522  0 16:12 pts/1    00:00:00 sh process-monitor.sh name

其中 3036 是需要查找的进程pid,而 4522、4523 就是子 Shell 的 pid。 为了避免这种情况,需要进一步明确查找条件,考虑到所要查找的是 Java 程序,就可以通过 Java 的关键字进行匹配:

#! /bin/bash
# process-monitor.sh
process=$1
pid=$(ps -ef | grep $process | grep '/bin/java' | grep -v grep | awk '{print $2}')
echo $pid

获取 Shell 脚本自身进程 pid

这里涉及两个指令:
1. $$ :当前 Shell 进程的 pid
2. 2. $! :上一个后台进程的 pid 可以使用这两个指令来获取相应的进程 pid。例如,如果需要获取某个正在执行的进程的 pid(并写入指定的文件):

myCommand && pid=$!
myCommand & echo $! >/path/to/pid.file

注意,在脚本中执行 $! 只会显示子 Shell 的后台进程 pid,如果子 Shell 先前没有启动后台进程,则没有输出。

查看指定进程是否存在

在获取到 pid 之后,还可以根据 pid 查看对应的进程是否存在(运行),这个方法也可以用于 kill 指定的进程。

if ps -p $PID > /dev/null
then
   echo "$PID is running"
   # Do something knowing the pid exists, i.e. the process with $PID is running
fi

本文转载自:https://www.cnblogs.com/lovychen/p/6211209.html

2016-11-29 18:40:11 zhukangle 阅读数 4256
  • Linux系统编程、网络编程》第5章 进程控制

    课程内容: 进程与程序、进程PID与三个特殊进程、fork函数的作用、父子进程对文件的共享、execve加载函数、system函数、进程的资源回收、wait函数、进程状态、java进程、进程关系、守护进程,return/exit/_exit、环境变量表、环境变量API、C程序的内存空间布局、C库。

    271 人正在学习 去看看 张先凤

tatus文件,第一行的Name即为进程名,C程序实现根据PID获取进程名和根据进程名获取PID,大家参考使用吧

Liunx中通过进程名查找进程PID可以通过 pidof [进程名] 来查找。反过来 ,相同通过PID查找进程名则没有相关命令。在linux根目录中,有一个/proc的VFS(虚拟文件系统),系统当前运行的所有进程都对应于该目录下的一个以进程PID命名的文件夹,其中存放进程运行的N多信息。其中有一个status文件,cat显示该文件, 第一行的Name即为进程名。

打开stardict程序,进程名为stardict;

shell中分别根据Pid获取进程名、根据进程名获取Pid

1)查找stardict的pid:pidof stardict

2)根据1)的pid查找进程名: grep "Name:" /proc/5884/status

应用:kill一个进程需要指定该进程的pid,所以我们需要先根据进程名找到pid,然后再kill;
killall命令则只需要给定进程名即可,应该是封装了这个过程。

C程序中实现上述过程

复制代码代码如下:

#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <string.h>

#define BUF_SIZE 1024

void getPidByName(char* task_name)
{
    DIR *dir;
    struct dirent *ptr;
    FILE *fp;
    char filepath[50];//大小随意,能装下cmdline文件的路径即可
    char cur_task_name[50];//大小随意,能装下要识别的命令行文本即可
    char buf[BUF_SIZE];
    dir = opendir("/proc"); //打开路径
    if (NULL != dir)
    {
        while ((ptr = readdir(dir)) != NULL) //循环读取路径下的每一个文件/文件夹
        {
            //如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过
            if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))             
            continue;
            if (DT_DIR != ptr->d_type) 
              continue;

            sprintf(filepath, "/proc/%s/status", ptr->d_name);//生成要读取的文件的路径
            fp = fopen(filepath, "r");//打开文件
            if (NULL != fp)
            {
                if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
                fclose(fp);
                continue;
             }
            sscanf(buf, "%*s %s", cur_task_name);

                //如果文件内容满足要求则打印路径的名字(即进程的PID)
                if (!strcmp(task_name, cur_task_name))
                printf("PID:  %s\n", ptr->d_name);
                fclose(fp);
            }

        }
        closedir(dir);//关闭路径
    }
}

void getNameByPid(pid_t pid, char *task_name) {
    char proc_pid_path[BUF_SIZE];
    char buf[BUF_SIZE];

    sprintf(proc_pid_path, "/proc/%d/status", pid);
    FILE* fp = fopen(proc_pid_path, "r");
    if(NULL != fp){
        if( fgets(buf, BUF_SIZE-1, fp)== NULL ){
            fclose(fp);
        }
        fclose(fp);
        sscanf(buf, "%*s %s", task_name);
    }
}

void main(int argc, char** argv)
{
    char task_name[50];
    pid_t pid = getpid();

    printf("pid of this process:%d\n", pid);
    getNameByPid(pid, task_name);

    /*
    strcpy(task_name, argv[0]+2);
    printf("task name is %s\n", task_name);
    getPidByName(task_name);
    */
    printf("task name is %s\n", task_name);
    getPidByName(task_name);
    sleep(15);
}

运行结果:

进入/proc/9674/status查看文件内容,一切对应。

复制代码代码如下:

Name: test
State: S (sleeping)
Tgid: 9674
Pid: 9674
PPid: 7438
TracerPid: 0
Uid: 1000 1000 1000 1000
Gid: 1000 1000 1000 1000
FDSize: 256
Groups: 4 24 27 30 46 112 124 1000 
VmPeak:  4340 kB
VmSize:  4336 kB
VmLck:  0 kB
VmPin:  0 kB
VmHWM:  600 kB
VmRSS:  600 kB
VmData:  184 kB
VmStk:  136 kB
VmExe:  4 kB
VmLib:  1920 kB
VmPTE:  32 kB
VmSwap:  0 kB
Threads: 1
SigQ: 0/15776
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000001fffffffff
Seccomp: 0
Cpus_allowed: f
Cpus_allowed_list: 0-3
Mems_allowed: 00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 1
nonvoluntary_ctxt_switches: 4

Linux获取进程pid

阅读数 3257

没有更多推荐了,返回首页