Advertisement

使用Shell脚本查询进程运行时长

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:PDF


简介:
本文介绍了如何利用Shell脚本来查询Linux系统中特定进程的运行时间,帮助用户轻松监控和管理后台任务。 在Linux系统管理中,Shell脚本是一个非常强大的工具,它允许我们自动化执行一系列命令和任务。有时我们需要监控或控制进程的运行状态,例如确保长时间运行的任务不会无限制地持续下去。 `ps` 命令是 Linux 中用于报告当前系统中进程状态的重要工具,提供了多种格式来展示进程的信息。在 `ps -p 4260 -o pid,start_time,etime,comm` 命令中,“start_time” 列显示了进程启动的时间,而“etime”列则表示自启动以来的总时间(以天-小时:分钟:秒格式),但在需要精确到秒时不太方便。 为了解决这个问题,我们可以编写一个 Shell 脚本来计算进程运行的确切时间。以下是一个示例脚本: ```bash #!/bin/bash function show_elapsed_time() { user_hz=$(getconf CLK_TCK) # 通常值是100在x86/x86_64系统上 pid=$1 jiffies=$(cat /proc/$pid/stat | cut -d -f22) sys_uptime=$(cat /proc/uptime | cut -d -f1) last_time=$(( ${sys_uptime%.*} * 1000000 + ${jiffies/user_hz})) echo 进程 $pid 运行了 $last_time 秒。 } if [ $# -ge 1 ]; then for pid in $@; do show_elapsed_time $pid done fi while read pid; do show_elapsed_time $pid; done ``` 这个脚本定义了一个名为 `show_elapsed_time` 的函数,该函数接收一个进程ID作为参数。它首先获取系统的时钟ticks(通常是100Hz),然后读取指定进程的 `/proc/$pid/stat` 文件中的第22个字段,这是自启动以来经历的系统时钟ticks数。接着从 `/proc/uptime` 获取系统的总运行时间,并通过计算得到进程的实际运行秒数。 在执行脚本时可以传入一个或多个进程ID,脚本将依次打印每个进程的运行时间;如果没有提供参数,则会从标准输入读取进程ID以方便与其他命令结合使用。这样我们可以更灵活地处理进程运行时间的计算,并设置超时机制来自动终止长时间未完成的任务。 了解 `/proc` 文件系统中的 `stat`, `$pid/stat`, 和 `uptime` 等文件,对于深入理解Linux内核和进程管理至关重要。这些实时更新的文件能提供系统的当前状态信息。利用Shell脚本结合 `/proc` 文件系统可以有效地监控与管理系统资源,确保合理使用并提高运维效率的同时预防潜在性能问题的发生。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • 使Shell
    优质
    本文介绍了如何利用Shell脚本来查询Linux系统中特定进程的运行时间,帮助用户轻松监控和管理后台任务。 在Linux系统管理中,Shell脚本是一个非常强大的工具,它允许我们自动化执行一系列命令和任务。有时我们需要监控或控制进程的运行状态,例如确保长时间运行的任务不会无限制地持续下去。 `ps` 命令是 Linux 中用于报告当前系统中进程状态的重要工具,提供了多种格式来展示进程的信息。在 `ps -p 4260 -o pid,start_time,etime,comm` 命令中,“start_time” 列显示了进程启动的时间,而“etime”列则表示自启动以来的总时间(以天-小时:分钟:秒格式),但在需要精确到秒时不太方便。 为了解决这个问题,我们可以编写一个 Shell 脚本来计算进程运行的确切时间。以下是一个示例脚本: ```bash #!/bin/bash function show_elapsed_time() { user_hz=$(getconf CLK_TCK) # 通常值是100在x86/x86_64系统上 pid=$1 jiffies=$(cat /proc/$pid/stat | cut -d -f22) sys_uptime=$(cat /proc/uptime | cut -d -f1) last_time=$(( ${sys_uptime%.*} * 1000000 + ${jiffies/user_hz})) echo 进程 $pid 运行了 $last_time 秒。 } if [ $# -ge 1 ]; then for pid in $@; do show_elapsed_time $pid done fi while read pid; do show_elapsed_time $pid; done ``` 这个脚本定义了一个名为 `show_elapsed_time` 的函数,该函数接收一个进程ID作为参数。它首先获取系统的时钟ticks(通常是100Hz),然后读取指定进程的 `/proc/$pid/stat` 文件中的第22个字段,这是自启动以来经历的系统时钟ticks数。接着从 `/proc/uptime` 获取系统的总运行时间,并通过计算得到进程的实际运行秒数。 在执行脚本时可以传入一个或多个进程ID,脚本将依次打印每个进程的运行时间;如果没有提供参数,则会从标准输入读取进程ID以方便与其他命令结合使用。这样我们可以更灵活地处理进程运行时间的计算,并设置超时机制来自动终止长时间未完成的任务。 了解 `/proc` 文件系统中的 `stat`, `$pid/stat`, 和 `uptime` 等文件,对于深入理解Linux内核和进程管理至关重要。这些实时更新的文件能提供系统的当前状态信息。利用Shell脚本结合 `/proc` 文件系统可以有效地监控与管理系统资源,确保合理使用并提高运维效率的同时预防潜在性能问题的发生。
  • Shell的实际内存使状况
    优质
    本文介绍了如何通过编写Shell脚本来查询Linux系统中特定进程的实际内存使用情况,帮助用户监控和优化系统性能。 代码如下: ```bash #!binbash #****************************************************************# # 脚本名称: pm # 作者: osdba # 创建日期: 2010-01-31 # 修改作者: # 修改日期: 2010-01-31 # 功能描述: 显示进程使用的内存情况 #***************************************************************# ``` 注意:`functio` 可能是 `function` 的拼写错误,如果需要修正,请告知。
  • 使Shell并启动的示例
    优质
    简介:本文提供了一个利用Shell脚本来检测系统中特定进程是否运行,并在未运行时自动启动该进程的具体实例和步骤说明。 使用Shell脚本监控进程是否存在,并在不存在的情况下启动它的一个实例代码如下: ```sh #!/bin/sh ps -fe | grep processString | grep -v grep if [ $? -ne 0 ]; then echo start process..... else echo running..... fi ``` 其中`processString`表示进程的特征字符串,能够查询到唯一进程。当返回值为0时,表示该进程存在;不等于0则表示不存在。 为了定时执行此脚本,可以使用crontab命令编辑定时任务: ```sh crontab -e # 添加以下行来设置每小时4分、12分和21分执行一次: 0 04,12,21 * * * /bin/bash /home/mysh/monitor ``` 这样就可以确保脚本按照设定的时间自动运行,监控并启动指定进程。
  • Linux ShellNUMA信息
    优质
    本文介绍了如何使用Linux Shell脚本编写程序来查询和分析系统的NUMA架构信息,帮助用户更好地理解与优化多处理器系统性能。 Linux Shell脚本查看NUMA(Non-Uniform Memory Access)信息是针对系统硬件性能优化的重要步骤。NUMA是一种内存架构,在这种架构下,不同的处理器访问内存的速度不同,这取决于它们与内存控制器的距离。在多处理器系统中,理解NUMA拓扑对于任务分配和资源利用率的优化至关重要。 本段落提供的脚本主要用于获取Linux系统的NUMA相关信息,包括逻辑处理器数量、物理CPU插槽数以及每个插槽内的核心信息等。以下是脚本中各个函数的具体解释: 1. `get_nr_processor()`: 这个函数用于计算系统中的逻辑处理器总数。通过读取`/proc/cpuinfo`文件并查找以processor开头的行,然后使用`wc -l`命令统计这些行的数量来获取结果。 2. `get_nr_socket()`: 函数用来确定物理CPU插槽的数量。同样地,从`/proc/cpuinfo`中提取physical id字段,并用`awk`工具对它们进行排序和去重处理后计数得到最终的插槽数量。 3. `get_nr_siblings()`: 这个函数获取每个处理器兄弟核心(即在同一物理插槽内与之共享资源的核心)的数量。通过使用`grep`命令筛选出`sibling`字段,再利用`awk`工具提取和排序这些值以得到结果。 4. `get_nr_cores_of_socket()`: 该函数用于确定每个CPU插槽中的核心数。同样从`/proc/cpuinfo`文件中读取信息,并根据cpu cores字段进行去重处理后计数得出最终的核心数量。 5. 脚本的主体部分创建了一个表格,展示各个处理器的Processor ID、Core ID和Socket ID等关键信息,通过遍历`/proc/cpuinfo`文件逐行解析出相关信息并填充到该表中。 6. 此外脚本还提供了对系统CPU信息的整体总结,包括逻辑处理器数、物理插槽数量以及每个插槽内的核心数量。如果总的核心数等于逻辑处理器的数量,则表明超线程未开启;反之则表示超线程已启用状态。 通过运行此脚本,用户可以迅速获取关于NUMA架构的详细信息,这对于在云计算环境中进行性能优化和资源调度非常有用。例如,在部署虚拟机或容器时了解NUMA拓扑可以帮助更好地分配系统资源,避免跨节点通信所带来的性能损失问题。在高负载及高性能计算场景下正确理解和利用这些特性能够显著提高系统的整体效率。
  • 在Linux中Shell批处理
    优质
    本教程介绍如何在Linux系统中编写和执行通用Shell脚本来自动化日常任务及文件管理,实现高效批量操作。 在Linux环境下编写通用的shell脚本用于执行批处理任务是非常常见的做法。这样的脚本能帮助用户自动化一系列命令或操作,提高工作效率并减少人为错误的可能性。通过合理设计和测试这些脚本,可以有效地管理复杂的工作流程或者定期的任务需求,在系统维护、数据备份等领域发挥重要作用。
  • 使Shell批量户添加
    优质
    简介:本文介绍了如何利用Shell脚本自动化创建多个系统用户的流程,提高管理员工作效率。通过编写和执行简单的脚本命令,可以快速、安全地批量添加新用户到Linux系统中。 以下是一个用于创建用户的Shell脚本示例: ```bash #!/bin/bash for name in tom joy john mark james; do useradd $name echo redhat | passwd --stdin $name done ``` 执行该脚本后,将自动为用户tom、joy、john、mark和james创建账户,并且所有用户的密码都将设置为“redhat”。此Shell脚本使用了`useradd`命令来添加新用户,利用`echo`与`passwd --stdin`组合通过标准输入管道(|)修改用户的密码。同时,它还运用了for循环结构。 另外一种实现方式是将用户名和对应的初始密码保存在一个文件中,并通过awk读取这些信息然后执行相应的操作。
  • 使Shell批量户添加
    优质
    简介:本文介绍如何利用Shell脚本实现Linux系统中用户的批量创建,提高管理效率和减少人为错误。 在Linux系统管理中,Shell脚本是一种非常实用的自动化工具,尤其适用于执行重复性任务如批量创建用户。本段落将深入探讨如何利用Shell脚本来实现批量添加用户,并讨论相关技术点。 我们需要了解`useradd`命令,这是用于创建新用户的Linux工具。其基本语法为`useradd [选项] 用户名`,会自动建立一个新的系统账户,并配置相应的主目录和环境变量等信息。在我们的示例中,使用了`useradd $name`来创建名为$name$的新用户。 接下来是`passwd`命令,用于设置或修改用户的密码。通过执行`passwd --stdin $name < redhat`可以将redhat作为标准输入传递给`passwd`, 从而为$username$设定密码。这里使用的--stdin选项允许我们使用管道或者重定向来传输密码,避免在脚本中直接显示明文的密码,提高安全性。 为了批量处理用户创建任务,在脚本里我们可以利用for循环遍历一个预设的名字列表:`for name in tom joy john mark james; do useradd $name && echo redhat | passwd --stdin $name; done` 管道符号(|)是Shell编程中的关键元素,它允许将前一命令的输出作为后续命令的输入。例如,在这个上下文中,`echo redhat | passwd --stdin $username`会把字符串redhat传递给passwd指令用于设置用户名为$name$的用户的密码。 除了上述基础方法之外,我们还可以通过读取一个包含用户信息和对应密码文件(如accounts.txt)来扩展脚本。该文本段落件中每行包括一对空格分隔的用户名及其对应的初始密码。使用`awk`命令可以方便地处理这个列表: ```bash #!binbash while read -r username password; do useradd $username echo $password | passwd --stdin $username done < accounts.txt ``` 在此扩展版本中,我们利用了read命令从accounts文件逐行读取数据。`-r`选项防止反斜杠转义的问题。然后通过while循环将每一行为用户名与密码分别赋值,并执行相同的操作。 这种方式使得批量用户创建过程更加灵活且可控:不仅能管理大量用户的添加操作,还能确保每个账户的安全性设置符合要求。这对于需要快速部署多用户环境的大型系统来说非常实用。在实际应用中,还可以根据具体需求加入更多逻辑处理步骤,比如检查用户名是否已存在、验证密码强度等措施来提升脚本的功能性和安全性。
  • 使Shell服务器监控的方法
    优质
    本文介绍了利用Shell脚本来实现对服务器上运行进程的有效监控,包括检测异常、自动重启服务等实用技巧。 这段文字介绍了如何使用Shell脚本实现服务器进程监控的方法,并认为该方法具有参考价值。有兴趣的朋友可以参考一下。
  • 怎样使Android系统和应shell
    优质
    本文将介绍如何在Android设备上配置并执行Shell脚本,包括必要的权限设置、使用Termux应用等方法,帮助开发者和高级用户优化自动化操作。 让Android系统或Android应用执行shell脚本的方法有二:方法一是通过编辑/system/init/init.c文件,在其中加入执行脚本的命令。方法二是启动一个服务,并由该服务来运行脚本。
  • Shell和BatJava
    优质
    本文介绍了如何通过Windows批处理(.bat)文件和Unix/Linux Shell脚本执行Java应用程序的方法与技巧。 如何使用Shell和Bat脚本运行Java程序?