问题:
本周在配合系统测试过程中,发现系统报文接收异常, 排查过程中发现应用进程启动异常。 当时状态模拟如下:
[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);
}
Be First to Comment