怎么查看linux进程名称

怎么查看linux进程名称,第1张

1、连接上相应的linux主机,进入到等待输入shell指令的linux命令行状态下。

2、其次,在命令行中输入:ps -ef。

3、最后,键盘按“回车键”运行shell指令,此时会看到所有linux进程的CMD名称。

在编写网络服务器程序时,为了响应客户端的请求,我们经常需要新建进程来处理业务流程;而且又是为了关闭某个非法请求或者关闭长连接的客户端,这时就需要杀死进程 killall proc_name。 但是在新建进程时,子进程名与父进程名相同。因此需要由进程名及参数来区分客户端连接。

在linux中prctl可以满足这个要求,下满是man手册:

PR_SET_NAME (since Linux 2.6.9)

Set the process name for the calling process, using the value in

the location pointed to by (char *) arg2. The name can be up to

16 bytes long, and should be null terminated if it contains

fewer bytes.

但是prctl修改的进程名,只能是16个字节(包括'\0')。下面是修改的代码(changetitle.c):

#include <stdio.h>

#include <sys/prctl.h>

int main(int argc, char *argv[], char *envp[])

{

char *new_name = "abcdefghijklmnopqrstuvwxyz"

getchar()

prctl(PR_SET_NAME, new_name)

getchar()

return 0

}

当新名称长度大于16时就会截断,上面的新名字截断后是abcdefghijklmno。这对于我们来说是有缺陷的。而且通过ps -aux 查看,进程名称并没有改变,改变的只是/prco/$(PID)/stat和

/prco/$(PID)/status的值,而/prco/$(PID)/cmdline并没有改变。这种方式使用起来也是不方便的。

下面介绍另一种方式,可以与上面的方式互补。

首先看一下main函数的原型:int main(int argc, char *argv[])

argv[0]存放的是终端执行的程序名称也就是进程名。argv[1...argc-1]存放的是命令行参数。

linux中main()还有一个隐藏参数就是环境变量信息,存放了运行时所需要的环境变量。

我们可以通过以下来访问这个变量

extern char **environ

argv与environ是连续存放在栈区的。下面代码可以查看参数信息:

#include <stdio.h>

#include <string.h>

extern char **environ

int main(int argc , char *argv[])

{

int i

printf("argc:%d\n" , argc)

for (i = 0i <argc++i)

{

printf("argv[%d](0x%x):%s\n" , i , (unsigned int)argv[i], argv[i])

}

printf("evriron=0x%x\n" , (unsigned int)environ[0])

return 0

}

通过上面可以看出,我们只需要修改argv[0]所指向的内存空间的内容,就可以修改进程名。但是如果新名称比argv[0]的长度小,我们可以直接修改,并把多余的部分请0,如果新名称

比argv[0]长我们需要两步:

1、申请新内存保存环境变量信息和argv[1...argc-1]参数信息

2、修改argv[0],将新名称往后到environ的最后一项清0

以下是参考代码:

#include <unistd.h>

#include <stdio.h>

#include <stdarg.h>

#include <string.h>

#include <stdlib.h>

#include <sys/prctl.h>

# define MAXLINE 2048

extern char **environ

static char **g_main_Argv = NULL/* pointer to argument vector */

static char *g_main_LastArgv = NULL/* end of argv */

void setproctitle_init(int argc, char **argv, char **envp)

{

int i

for (i = 0envp[i] != NULLi++) // calc envp num

continue

environ = (char **) malloc(sizeof (char *) * (i + 1))// malloc envp pointer

for (i = 0envp[i] != NULLi++)

{

environ[i] = malloc(sizeof(char) * strlen(envp[i]))

strcpy(environ[i], envp[i])

}

environ[i] = NULL

g_main_Argv = argv

if (i >0)

g_main_LastArgv = envp[i - 1] + strlen(envp[i - 1])

else

g_main_LastArgv = argv[argc - 1] + strlen(argv[argc - 1])

}

void setproctitle(const char *fmt, ...)

{

char *p

int i

char buf[MAXLINE]

extern char **g_main_Argv

extern char *g_main_LastArgv

va_list ap

p = buf

va_start(ap, fmt)

vsprintf(p, fmt, ap)

va_end(ap)

i = strlen(buf)

if (i >g_main_LastArgv - g_main_Argv[0] - 2)

{

i = g_main_LastArgv - g_main_Argv[0] - 2

buf[i] = '\0'

}

(void) strcpy(g_main_Argv[0], buf)

p = &g_main_Argv[0][i]

while (p <g_main_LastArgv)

*p++ = '\0'

g_main_Argv[1] = NULL

prctl(PR_SET_NAME,buf)

}

int main(int argc, char *argv[])

{

char argv_buf[MAXLINE] = {0}// save argv paramters

for(int i = 1i <argci++)

{

strcat(argv_buf, argv[i])

strcat(argv_buf, " ")

}

setproctitle_init(argc, argv, environ)

setproctitle("%s@%s %s", "new_name", "ip", argv_buf)

for (int i = 0environ[i] != NULLi++)

free(environ[i])

getchar()

return 0

}

上面的代码使用了prctl和修改argv[0]两种修改方法的结合,通过ps -a 、 ps -ef 、ps -aux、 top 等等命令都只能查询到新进程名,/proc/$PID/ 下的文件也显示了新进程名的信息。

应用场景:

1、标识父子进程名称,防止被误杀

2、构造假的进程名及参数,引导非法进入人员到蜜罐系统,取证

服务名称 功能 默认 建议 备注说明

NetworkManager 用于自动连接网络,常用在Laptop上 开启 关闭 对服务器无用

abrt-ccpp 开启 自定 对服务器无用

abrt-oops 开启 自定 对服务器无用

abrtd 开启 自定 对服务器无用

acpid 电源的开关等检测管理,常用在Laptop上 开启 自定 对服务器无用

atd 在指定时间执行命令 开启 关闭 如果用crond,则可关闭它

auditd 审核守护进程 开启 开启 如果用selinux,需要开启它

autofs 文件系统自动加载和卸载 开启 自定 只在需要时开启它,可以关闭

avahi-daemon 本地网络服务查找 开启 关闭 对服务器无用

bluetooth 蓝牙无线通讯 开启 关闭 对服务器无用

certmonger 关闭 关闭

cpuspeed 调节cpu速度用来省电,常用在Laptop上 开启 关闭 对服务器无用

crond 计划任务管理 开启 开启 常用,开启

cups 通用unix打印服务

开启 关闭 对服务器无用

dnsmasq dns cache 关闭 关闭 DNS缓存服务,无用

firstboot 系统安装后初始设定 关闭 关闭

haldaemon 硬件信息收集服务 开启 开启

ip6tables ipv6防火墙 开启 关闭 用到ipv6网络的就用,一般关闭

iptables

ipv4防火墙 开启 开启 ipv4防火墙服务

irqbalance cpu负载均衡 开启 自定 多核cup需要

kdump 硬件变动检测 关闭 关闭 服务器无用

lvm2-monitor lvm监视 开启 自定 如果使用LVM逻辑卷管理就开启

matahari-broker 关闭 关闭 此服务不清楚,我关闭

matahari-host 关闭 关闭 此服务不清楚,我关闭

matahari-network 关闭 关闭 此服务不清楚,我关闭

matahari-service 关闭 关闭 此服务不清楚,我关闭

matahari-sysconfig 关闭 关闭 此服务不清楚,我关闭

mdmonitor 软raid监视 开启 自定

messagebus 负责在各个系统进程之间传递消息 开启 开启 如停用,haldaemon启动会失败

netconsole 关闭 关闭

netfs 系统启动时自动挂载网络文件系统 开启 关闭 如果使用nfs服务,就开启

network 系统启动时激活所有网络接口 开启 开启 网络基础服务,必需!

nfs 网络文件系统 关闭 关闭 nfs文件服务,用到就开启

nfslock nfs相关 开启 关闭 nfs相关服务,用到就开启

ntpd 自动对时工具 关闭 自定 网络对时服务,用到就开启

ntpdate 自动对时工具 关闭 关闭

oddjobd 与D-BUS相关 关闭 关闭

portreserve RPC 服务相关 开启 自定 可以关闭

postfix 替代sendmail的邮件服务器 开启 自定 如果无邮件服务,可关闭

psacct 负荷检测 关闭 关闭 可以关闭

qpidd 消息通信 开启 开启

quota_nld 关闭 关闭 可以关闭

rdisc 自动检测路由器 关闭 关闭

restorecond selinux相关 关闭 关闭 如果开启了selinux,就需开启

rpcbind 开启 开启 关键的基础服务,nfs服务和桌面环境都依赖此服务!相当于CentOS 5.x里面的portmap服务。

rpcgssd NFS相关 开启 关闭 NFS相关服务,可选

rpcidmapd RPC name to UID/GID mapper 开启 关闭 NFS相关服务,可选

rpcsvcgssd NFS相关 关闭 关闭 NFS相关服务,可选

rsyslog 提供系统的登录档案记录 开启 开启 系统日志关键服务,必需!

saslauthd sasl认证服务相关 关闭 关闭

smartd 硬盘自动检测守护进程 关闭 关闭

spice-vdagentd 开启 开启

sshd ssh服务端,可提供安全的shell登录

开启 开启 SSH远程登录服务,必需!

sssd 关闭 关闭

sysstat 开启 开启 一组系统监控工具的服务,常用

udev-post 设备管理系统 开启 开启

wdaemon 关闭 关闭

wpa_supplicant 无线认证相关 关闭 关闭

ypbind network information service客户端 关闭 关


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8462404.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-16
下一篇2023-04-16

发表评论

登录后才能评论

评论列表(0条)

    保存