kill多个同名进程

问题:   

       本周在配合系统测试过程中,发现系统报文接收异常, 排查过程中发现应用进程启动异常。 当时状态模拟如下: 

[root@centosgpt server]# ps -ef|grep daemon
dbus        934      1  0 Jul22 ?        00:01:15 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root        941      1  0 Jul22 ?        00:00:15 /usr/sbin/NetworkManager --no-daemon
root      81345      1  0 09:27 ?        00:00:00 daemon
root      81348      1  0 09:27 ?        00:00:00 daemon
root      81351      1  0 09:27 ?        00:00:00 daemon
root      81354      1  0 09:27 ?        00:00:00 daemon
root      81357      1  0 09:28 ?        00:00:00 daemon
root      81360      1  0 09:28 ?        00:00:00 daemon status
root      81364      1  0 09:28 ?        00:00:00 daemon start
root      81367      1  0 09:28 ?        00:00:00 daemon status
root      81370      1  0 09:28 ?        00:00:00 daemon
root      81372  80347  0 09:28 pts/2    00:00:00 grep --color=auto daemon

  daemon status, daemon start 都属于异常进程。

 解决:

  过滤出异常进程, 通过xargs kill掉异常进程。 

# 查出所有异常进程
[root@centosgpt server]# ps -ef|grep -v grep | grep ' daemon s'
root      81360      1  0 09:28 ?        00:00:00 daemon status
root      81364      1  0 09:28 ?        00:00:00 daemon start
root      81367      1  0 09:28 ?        00:00:00 daemon status
# 过滤出进程编号
[root@centosgpt server]# ps -ef|grep -v grep | grep ' daemon s'|awk '{print $2}'
81360
81364
81367
# 通过发送退出信号将其退出, 由于进程指定了退出信号所以使用SIGUSR1
[root@centosgpt server]# ps -ef|grep -v grep | grep ' daemon s'|awk '{print $2}'| xargs kill -s SIGUSR1
# 查看下执行结果, OK
[root@centosgpt server]# ps -ef|grep daemon
dbus        934      1  0 Jul22 ?        00:01:15 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root        941      1  0 Jul22 ?        00:00:15 /usr/sbin/NetworkManager --no-daemon
root      81345      1  0 09:27 ?        00:00:00 daemon
root      81348      1  0 09:27 ?        00:00:00 daemon
root      81351      1  0 09:27 ?        00:00:00 daemon
root      81354      1  0 09:27 ?        00:00:00 daemon
root      81357      1  0 09:28 ?        00:00:00 daemon
root      81370      1  0 09:28 ?        00:00:00 daemon
root      81424  80347  0 09:32 pts/2    00:00:00 grep --color=auto daemon
  •  过滤异常进程的规则可以根据实际情况调整。 顺便把demo daemon的源码贴下。

xargs其他一些用法:

  •  参数替换  -i ,-I   一般是一行一行的赋值给{},可以用{} 代替。
[root@centosgpt xargs]# > a.c
[root@centosgpt xargs]# > b.c
[root@centosgpt xargs]# > c.c
[root@centosgpt ~]# ls *.c | xargs -t -I '{}' mv {} {}.old
mv a.c a.c.old
mv b.c b.c.old
mv c.c c.c.old
[root@centosgpt ~]# ls -atlr
。。。
-rw-r--r--.  1 root root     0 Jul 26 15:00 a.c.old
-rw-r--r--.  1 root root     0 Jul 26 15:01 b.c.old
-rw-r--r--.  1 root root     0 Jul 26 15:01 c.c.old
  •  分组 -n 分组功能,xargs的默认命令是echo. 如下实例删除数量比较多的文件
    ls *.old | xargs -n 10 rm -rf

 xargs man手册


下面是实验用的守护进程的代码,

[root@centosgpt server]# cat daemon.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <syslog.h>

int exit_flag = 0;
void init_loop()
{
    exit_flag = 0;
}

int do_loop()
{
     return !exit_flag;
}

void do_exit()
{
     exit_flag = 1;
     return ;
}

void daemon_init()
{
    pid_t pid;

    pid = fork();
    if (pid < 0){
        exit(-1);
    }
    if (pid > 0){
        exit(0);
    }

    if (setsid()<0){
        exit(-1);
    }

    signal(SIGUSR1, (void(*)())do_exit);
    signal(SIGCHLD, SIG_IGN);
    signal(SIGHUP, SIG_IGN);

    pid = fork();
    if (pid < 0){
        exit(-1);
    }
    if (pid > 0){
        exit(0);
    }

    umask(0);
    return;
}


int  main()
{
     init_loop();
     daemon_init();
     while(do_loop()) {
         sleep(1);
     }
     exit(0);
}

参考:

Linux基础:xargs命令

xargs

shell 学习四十五天---xargs

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注