我目前正在编写一个脚本,其目的是杀死运行时间超过阈值的进程。 “杀手”在一堆主机上运行,作业由服务器发送到每个主机。我的想法是使用'ps'来获得作业的运行时间,但所有打印的都是
17433 17433? 00:00:00 python
无论我等待的时间。
我试图找到一个简化的例子,以避免发布我写的所有代码。我们称S为服务器,H为主机。
如果我执行以下步骤:
1)从服务器ssh登录@H 2)python myscript.py(现已登录主机) 3)ps -U登录(仍然在主机上)
就时间而言,我得到的结果与00:00:00之上的结果相同。
如何获得真正的执行时间?当我在我的机器上本地执行所有操作时,它可以正常工作。
非常感谢你的帮助。
诉P>
答案 0 :(得分:2)
或者,您可以在/ var / run中查看pid文件的创建,假设您的进程已创建一个并使用find命令查看它是否超过某个阈值:
find /var/run/ -name "myProcess.pid" -mtime +1d
如果符合条件,则返回文件名(最后修改至少1天前)。您可能还需要检查以确保进程实际正在运行,因为它可能已崩溃并将pid留在后面。
答案 1 :(得分:1)
试试这个:
ps kstart_time -ef | grep myProc.py | awk '{print $5}'
这将显示进程myProc.py
的开始日期/时间:
[ 19:27 root@host ~ ]# ps kstart_time -ef | grep "httpd\|STIME" | awk '{print $5}'
STIME
19:25
另一个选项是etime
。
etime
是自流程启动以来经过的时间,格式为dd-hh:mm:ss
。 dd是天数; ......,小时数;毫米,分钟数; ss,秒数。
[ 19:47 root@host ~ ]# ps -eo cmd,etime
CMD ELAPSED
/bin/sh 2-16:04:45
还有另一种方法:
获取进程pid并在/proc
中的相应子目录中读取时间戳。
首先,使用ps命令(ps -ef
或ps aux
)获取进程pid
然后,使用ls
命令显示目录的创建时间戳。
[ 19:57 root@host ~ ]# ls -ld /proc/1218
dr-xr-xr-x 5 jon jon 0 Sep 20 16:14 /proc/1218
您可以从时间戳中看出流程1218在9月20日16:14开始执行。
答案 2 :(得分:1)
如果你想要这个过程有多长,你可以试试
stat -c %Y /proc/`pgrep python`
..它会在纪元时间回复给你。如果你想要一次性杀戮,我建议使用上面提到的发现(但也许指向/proc
)