linux 进程句柄,linux 文件描述符
在linux下怎么使用shell脚本修改文本里的相关内容
在Linux系统中,shell脚本实现对服务器和进程资源的有效监控是运维过程中不可或缺的工具。本文将详细介绍在Linux下实现常见监控需求及其对应的shell脚本编写方法,帮助系统管理员及时发现和处理异常情况。
目录:
检查进程是否存在
检测进程CPU利用率
检测进程内存使用量
检测进程句柄使用量
查看TCP或UDP端口是否在监听
查看进程名正在运行的个数
检测系统CPU负载
检测系统磁盘空间
总结
1.检查进程是否存在
通过脚本获取指定用户下指定进程名的进程ID。此函数接受两个参数:用户名和进程名。使用`ps`命令查找进程信息,通过`grep`过滤出所需进程,最后利用`sed`和`awk`提取进程ID。函数示例代码如下:
bash
function GetPID($username,$process_name){
ps-u$username-o pid,command| grep-v"total"| grep$process_name| awk'{print$1}'
}
2.检测进程CPU利用率
实时监控业务进程CPU利用率,通过`GetCpu`函数获取指定进程ID的进程CPU使用情况。此函数接收进程ID作为参数,使用`ps`查找进程信息,通过`grep`和`awk`计算CPU利用率。若CPU利用率超过限制(如80%),则输出告警信息。
bash
function CheckCpu($pid){
cpu_usage=$(ps-p$pid-o%cpu| tail-n 1)
if [$cpu_usage-gt 80 ]; then
echo"CPU usage is$cpu_usage%, exceeding the limit of 80%."
else
echo"CPU usage is$cpu_usage%, normal."
fi
}
3.检测进程内存使用量
监控业务进程内存使用量,通过`GetMem`函数获取指定进程ID的内存使用情况。此函数使用`ps`查找进程信息,并通过`grep`和`awk`计算内存使用量。当内存使用超过设定阈值(如1.6G)时,输出告警信息。
bash
function CheckMem($pid){
mem_usage=$(ps-p$pid-o rss| awk'{print$1}'| awk'{total+=$1} END{print total}')
if [$mem_usage-gt 16000000 ]; then
echo"Memory usage is$mem_usage KB, exceeding the limit of 1.6G."
else
echo"Memory usage is$mem_usage KB, normal."
fi
}
4.检测进程句柄使用量
监控业务进程句柄使用情况,通过`GetDes`函数获取指定进程ID的句柄使用量。此函数使用`ps`输出进程句柄信息,并通过`wc-l`统计句柄个数。当句柄使用超过阈值(如900个)时,输出告警信息。
bash
function CheckHandles($pid){
handles=$(ps-p$pid-o lsof| wc-l)
if [$handles-gt 900 ]; then
echo"Handle usage is$handles, exceeding the limit of 900."
else
echo"Handle usage is$handles, normal."
fi
}
5.查看TCP或UDP端口是否在监听
检查指定端口是否在监听,通过`PortCheck`函数判断指定端口的状态。此函数接收端口号作为参数,使用`netstat`输出端口占用信息,并通过`grep`, `awk`,和`wc`过滤出监听的TCP和UDP端口。当监听状态为0时,返回正常信息。
bash
function PortCheck($port){
tcp_count=$(netstat-ntulp| grep-c":$port.*LISTEN")
udp_count=$(netstat-nuLp| grep-c":$port.*LISTEN")
if [$tcp_count-eq 0 ]&& [$udp_count-eq 0 ]; then
echo"Port$port is not in listening state."
else
echo"Port$port is in listening state."
fi
}
6.查看进程名正在运行的个数
获取服务器上指定进程的启动个数,通过`CountProcesses`函数实现。此函数接收进程名作为参数,使用`ps`查找进程信息,并通过`grep`过滤出所需进程,最后统计个数。
bash
function CountProcesses($process_name){
count=$(ps-ef| grep$process_name| wc-l)
echo"Process$process_name is running in$count instances."
}
7.检测系统CPU负载
实时监控系统CPU负载情况,通过`LoadCheck`函数获取系统CPU实际占用值。此函数使用`vmstat`每5次循环获取系统CPU的idle值,取平均值计算CPU使用率。
bash
function LoadCheck(){
avg_idle=$(vmstat-n 5| tail-n 1| awk'{sum+=$4} END{print sum/5}')
cpu_usage=$((100- avg_idle))
echo"System CPU usage is$cpu_usage%, which is within the normal range."
}
8.检测系统磁盘空间
监控系统磁盘空间使用情况,通过`DiskCheck`函数获取指定目录的磁盘空间使用百分比。此函数接收目录名作为参数,使用`df`输出磁盘空间信息,并通过`grep`和`awk`过滤得到所需目录的使用百分比。
bash
function DiskCheck($directory){
space_used=$(df-k$directory| awk'{print$4}'| awk'{total+=$1} END{print total}')
space_total=$(df-k$directory| awk'{print$2}'| awk'{total+=$1} END{print total}')
usage_percentage=$(($space_used/$space_total* 100))
echo"$directory's disk usage is$usage_percentage%, within the normal range."
}
总结
利用shell脚本在Linux系统下实现资源监控,不仅简化了监控流程,提高了效率,还为系统管理员提供了实时、全面的监控信息。本文所介绍的监控方法和脚本示例,适用于日常服务器运维和进程管理场景,帮助系统管理员及时发现并解决资源异常情况,预防业务中断。
如何用python语言打开程序
在Python中,可以方便地使用os模块来运行其他脚本或者程序,这样就可以在脚本中直接使用其他脚本或程序提供的功能,而不必再次编写实现该功能的代码。为了更好地控制运行的进程,可以使用win32process模块中的函数,如果想进一步控制进程,则可以使用ctype模块,直接调用kernel32.dll中的函数.
【方式一】使用os.system()函数运行其他程序
os模块中的system()函数可以方便地运行其他程序或者脚本,模式如下:
os.system(command)
command:要执行的命令,如果要向脚本传递参数,可以使用空格分割程序及多个参数。
示例如下:
>>>importos
>>>os.system('notepad')#打开记事本程序.
0
>>>os.system('notepad1.txt')#打开1.txt文件,如果不存在,则创建.
0
【方式二】使用ShellExecute函数运行其他程序
除了使用os.system()函数外,还可以使用win32api模块中的ShellExecute()函数来运行其他程序,格式如下:
ShellExecute(hwnd, op, file, args, dir, show)
hwnd:父窗口的句柄,如果没有父窗口,则为0
op:要运行的操作,为open,print或者为空
file:要运行的程序,或者打开的脚本
args:要向程序传递的参数,如果打开的是文件则为空
dir:程序初始化的目录
show:是否显示窗口
示例如下:
>>>importwin32api
>>>win32api.ShellExecute(0,'open','notepad.exe','','',0)#后台执行
>>>win32api.ShellExecute(0,'open','notepad.exe','','',1)#前台打开
>>>win32api.ShellExecute(0,'open','notepad.exe','1.txt','',1)#打开文件
>>>win32api.ShellExecute(0,'open','httpm','','',1)#打开网页
>>>win32api.ShellExecute(0,'open','D:\\Opera.mp3','','',1)#播放视频
>>>win32api.ShellExecute(0,'open','D:\\hello.py','','',1)#运行程序
使用ShellExecute函数,就相当于在资源管理器中双击文件图标,系统会打开相应程序运行。
NOTE:
win32api安装win32/files/pywin32/因我的是64的操作系统,所以下载了这个:pywin32-216.win-amd64-py2.7
【方式三】使用ShellExecute函数运行其他程序
创建进程:
为了便于控制通过脚本运行的程序,可以使用win32process模块中的CreateProcess()函数创建
一个运行相应程序的进程。其函数格式为:
CreateProcess(appName, cmdLine, proAttr, threadAttr, InheritHandle, CreationFlags, newEnv, currentDir, Attr)
appName可执行文件名
cmdLine命令行参数
procAttr进程安全属性
threadAttr线程安全属性
InheritHandle继承标志
CreationFlags创建标志
currentDir进程的当前目录
Attr创建程序的属性
示例如下:
>>>win32process.CreateProcess('C:\\Windows\\notepad.exe','',None,None,0,win32process.CREATE_NO_WINDOW,
None,None,win32process.STARTUPINFO())
(<PyHANDLE:892>,<PyHANDLE:644>,21592,18780)#函数返回进程句柄、线程句柄、进程ID以及线程ID
结束进程:
可以使用win32process.TerminateProcess函数来结束已创建的进程,函数格式如下:
TerminateProcess(handle, exitCode)
handle要操作的进程句柄
exitCode进程退出代码
或者使用win32event.WaitForSingleObject等待创建的线程结束,函数格式如下:
WaitForSingleObject(handle, milisecond)
handle:要操作的进程句柄
milisecond:等待的时间,如果为-1,则一直等待.
示例如下:
>>>importwin32process
>>>handle=win32process.CreateProcess('C:\\Windows\\notepad.exe','',None,None,0,win32process
.CREATE_NO_WINDOW,None,None,win32process.STARTUPINFO())#打开记事本,获得其句柄
>>>win32process.TerminateProcess(handle[0],0)#终止进程
或者
>>>importwin32event
>>>handle=win32process.CreateProcess('C:\\Windows\\notepad.exe','',None,None,0,
win32process.CREATE_NO_WINDOW,None,None,win32process.STARTUPINFO())#创建进程获得句柄
>>>win32event.WaitForSingleObject(handle[0],-1)#等待进程结束
0#进程结束返回值
【方式四】使用ctypes调用kernel32.dll中的函数
使用ctypes模块可以让Python调用位于动态链接库的函数。
ctypes模块为Python提供了调用动态链接库中函数的功能。使用ctypes模块可以方便地调用由C语言编写的动态链接库,并向其传递参数。ctypes模块定义了C语言中的基本数据类型,并且可以实现C语言中的结构体和联合体。ctypes模块可以工作在Windows,Linux,Mac OS等多种操作系统,基本上实现了跨平台。
示例:
Windows下调用user32.dll中的MessageBoxA函数。
>>>fromctypesimport*
>>>user32=windll.LoadLibrary('user32.dll')
>>>user32.MessageBoxA(0,str.encode('Ctypesissosmart!'),str.encode('Ctypes'),0)
1
ctype模块中含有的基本类型与C语言类似,下面是几个基本的数据类型的对照:
---------------------------------------
Ctypes数据类型 C数据类型
---------------------------------------
c_char char
c_short short
c_int int
c_long long
c_float float
c_doule double
c_void_p void*
---------------------------------------
linux查看进程文件句柄linux查看进程文件
linux查看某个进程是否启动的命令是?
ps命令
-e现实所有进程
-f全格式
-h不显示标题
-l长格式
-a显示终端上所有进程,包括其它用户的进程
-r只显示正在运行的进程
-p指定pid
linux系统中如何查看进程号?
linux系统中查看进程号的方法如下
1、ps命令查找与进程相关的PID号:
2、psa显示现行终端机下的所有程序,包括其他用户的程序。
3、ps-A显示所有程序。
4、psc列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
5、ps-e此参数的效果和指定A参数相同。
6、pse列出程序时,显示每个程序所使用的环境变量。
7、psf用ASCII字符显示树状结构,表达程序间的相互关系。
8、ps-H显示树状结构,表示程序间的相互关系。
9、ps-N显示所有的程序,除了执行ps指令终端机下的程序之外。
10、pss采用程序信号的格式显示程序状况。
11、psS列出程序时,包括已中断的子程序资料。
12、ps-t终端机编号>指定终端机编号,并列出属于该终端机的进程状况。
怎么查看linux进程名称?
1、连接上相应的linux主机,进入到等待输入shell指令的linux命令行状态下。
2、其次,在命令行中输入:ps-ef。
3、最后,键盘按“回车键”运行shell指令,此时会看到所有linux进程的CMD名称。
linux怎么查看某个进程执行的文件路径?
linux下进程运行后,进程信息存储在/proc/进程id目录下面,进程id查看命令ps-ef|grep进程名,vi/proc/进程id/environ搜索PWD字段,则是该进程运行所在目录
Linux下如何查看进程打开的文件以及修改进程打开文件数上限?
1.查看进程打开文件r在/proc下,对应每个进程有一个以进程号命名的目录,该目录下有一个fd目录,该目录下面的每个文件是一个符号连接,其文件名对应该进程占用的一个文件描述符,而连接指向的内容表示文件描述符对应的实际文件。r2.修改进程打开文件数上限Linux默认的进程打开文件上限是1024个,可以通过ulimitr把所有用户的进程打开文件上限改为65536,可以加入下面两行r*softnofile65535r还可以只真对某个用户或某个组做修改,具体方法参见文件注释。修改后需要重新启动系统才能生效。