获取Linux设备系统启动时间和进程启动时间

发布于:2025-06-15 ⋅ 阅读:(19) ⋅ 点赞:(0)

获取Linux设备系统启动时间和进程启动时间

1、/proc/[pid]/stat

cat /proc/3889/stat 

3889 (syslogd) S 1 3889 3889 0 -1 4194368 98 0 0 0 2 5 0 0 20 0 1 0 2367 2723840 335 4294967295 65536 813332 3203767808 0 0 0 0 1 16386 1 0 0 17 1 0 0 0 0 0 880376 882517 884736 3203768080 3203768106 3203768106 3203768302 0
  1. PID (字段 0): 3889

    • 进程 ID 为 3889。
  2. 进程名 (字段 1): (syslogd)

    • 进程名称为 syslogd(系统日志守护进程)。
  3. 进程状态 (字段 2): S

    • S 表示进程处于 可中断睡眠(等待事件完成,如 I/O 操作)。

      R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop,Z:zombie, X:dead

  4. PPID (字段 3): 1

    • 父进程 ID 为 1(通常是 systemdinit 进程)。
  5. 进程组与会话 (字段 4-5):

    • PGID (字段 4): 3889(进程组 ID 与 PID 相同,表示是组长进程)。
    • Session ID (字段 5): 3889(会话 ID 与 PID 相同)。
  6. 终端信息 (字段 6-7):

    • tty_nr (字段 6): 0(无控制终端)。
    • tpgid (字段 7): -1(前台进程组 ID 无效,无终端关联)。
  7. 缺页统计 (字段 9-12):

    • minflt (字段 9): 98(次要缺页次数,无需磁盘 I/O)。
    • majflt (字段 11): 0(主要缺页次数,需磁盘 I/O)。
    • 子进程缺页统计(字段 10, 12)均为 0
  8. CPU 时间 (字段 13-16):

    • utime (字段 13): 2(用户态运行时间,单位:时钟滴答jiffies)。
    • stime (字段 14): 5(内核态运行时间,单位:时钟滴答jiffies)。
    • cutime: 0,累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies。
    • cstime: 0,累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies。
  9. 优先级与调度 (字段 17-20):

    • priority (字段 17): 20(动态优先级)。
    • nice (字段 18): 0(静态优先级调整值,默认优先级)。
    • num_threads (字段 19): 1(仅 1 个线程)。
    • itrealvalue (字段 20): 0(废弃字段)。
  10. 启动时间 (字段 21): 2367

    • start_time进程启动时刻(单位:时钟滴答),需结合系统启动时间计算绝对时间。
  11. 内存使用 (字段 22-24):

    • vsize (字段 22): 2723840(虚拟内存大小 ≈ 2.6 MB)。
    • rss (字段 23): 335(驻留物理内存页数,每页通常 4 KB → 335 × 4 KB ≈ 1.34 MB)。
    • rsslim (字段 24): 4294967295(RSS 软限制,值 0xFFFFFFFF 表示无限制)。
  12. 地址空间 (字段 25-30):

    • startcode/endcode (字段 25-26): 65536, 813332(代码段起止地址)。
    • startstack (字段 27): 3203767808(栈起始地址)。
    • kstkesp/kstkeip (字段 28-29): 0(当前栈指针和指令指针,可能为内核态值)。
    • signal/blocked (字段 30-33): 信号位图(待处理、阻塞、忽略、捕获的信号)。
  13. 挂起等待 (字段 34): 0

    • wchan: 0(等待事件的内核地址,0 表示无等待)。
  14. 退出与调度 (字段 37-41):

    • exit_signal (字段 37): 17(进程退出时向父进程发送的信号,SIGCHLD)。
    • processor (字段 38): 1(最后运行的 CPU 编号)。
    • rt_priority (字段 39): 0(实时优先级,0 表示普通进程)。
    • policy (字段 40): 0(调度策略,0 为 SCHED_NORMAL)。
  15. 内存布局 (字段 44-50):

    • start_data/end_data (字段 44-45): 880376, 882517(数据段起止)。
    • start_brk (字段 46): 884736(堆起始地址)。
    • arg_start/arg_end (字段 47-48): 3203768080, 3203768106(命令行参数地址)。
    • env_start/env_end (字段 49-50): 3203768106, 3203768302(环境变量地址)。
  16. 退出状态 (字段 51): 0

    • exit_code: 0(进程尚未退出)。

注:字段从0开始累计

进程的总Cpu时间processCpuTime = utime + stime + cutime + cstime,该值包括其所有线程的cpu时间。

2、/proc/stat

cat /proc/stat

cpu  76365 0 231716 826914 1167 0 14933 0 0 0
cpu0 71215 0 196028 280105 549 0 14930 0 0 0
cpu1 5150 0 35688 546809 618 0 3 0 0 0
intr 20010304 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8004733 0 0 0 0 0 10 408408 49114 3467541 0 270133 619373 0 0 0 96963 773185 0 0 0 0 4426 0 2 0 0 0 0 0 0 92496 0 0 0 1456328 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 1 1
ctxt 24407140
btime 1749798323
processes 13785
procs_running 2
procs_blocked 0
softirq 4706790 0 1038568 33285 1480921 0 0 16 1008048 0 1145952

总的cpu时间totalCpuTime = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest

btime 系统启动时间点

#!/bin/sh

ALL_SERVER=`cat /tmp/app/exec/app.json |grep name |awk -F ":" '{print $2}'| sed 's/"//g' | sed 's/,//g'`

RSize=0
VSize=0
PSize=0

printvalue()
{
	RSize=0
	VSize=0
	PSize=0
	boot_time=$(awk '/btime/ {print $2}' /proc/stat)
	echo "kernel_start  $boot_time"
	cd /proc
	for ecpt in $ALL_SERVER
	do
		allprocid=`ps | grep $ecpt | grep -v '/bin/sh' | grep -v 'grep' | awk '{print $1}'`

		for procid in $allprocid
		do
			awk '{print $14, $15, $16, $17, $22}' "/proc/$procid/stat" | {
			read utime stime cutime cstime start_time

			total_cpu_time_jiffies=$((utime + stime + cutime + cstime))

			# 获取当前系统时间(jiffies)
			uptime=$(awk '{print $1}' /proc/uptime)

			new_time=$((start_time / 100 + boot_time))

			echo "$ecpt  $new_time"
			}
		done
	done
	return 0
}


printinfo()
{
	printvalue
	date
	return 0
}

printinfo