取得设备运行时间

本文介绍了如何通过/proc/uptime获取Linux系统运行时间和空闲时间,并解析了在SMP系统中空闲时间可能是运行时间的几倍的原因。此外,还探讨了如何利用expr和bc命令进行Linux壳牌中的变量运算,包括浮点运算和高级数学操作,以及如何设置运算精度和进行不同进制转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/bin/bash
#取得设备运行时间
Time=$(cat /pro/uptime | cut -d '.' -f 1)
RunDay=$(($Time/86400))
RunHour=$(($Time%86400/3600))
RunMinute=$(($Time%3600/60))
RunSecond=$(($Time%60))
RunTime=$(printf "%02d:%02d:%02d:%02d" $RunDay $RunHour $RunMinute $RunSecond)
echo $RunTime

涉及到的知识点:

/proc/uptime详解

在Linux中,我们常常会使用到uptime命令去看看系统的运行时间,它与一个文件有关,就是/proc/uptime,下面对其进行详细介绍。 

1
2
3
4
master@jay-intel:~$ cat /proc/uptime
6447032.12 48185264.69
master@jay-intel:~$ cat /proc/cpuinfo  | grep processor | wc -l
8

第一列输出的是,系统启动到现在的时间(以秒为单位),这里简记为num1;
第二列输出的是,系统空闲的时间(以秒为单位),这里简记为num2。

注意,很多很多人都知道第二个是系统空闲的时间,但是可能你不知道是,在SMP系统里,系统空闲的时间有时会是系统运行时间的几倍,这是怎么回事呢?
因为系统空闲时间的计算,是把SMP算进去的,就是所你有几个逻辑的CPU(包括超线程)。

系统的空闲率(%) = num2/(num1*N) 其中N是SMP系统中的CPU个数。

从上面我的一台机器上的数据可知,
本机启动到现在的时间长度为:6447032.12 seconds = 74.6 days
空闲率为:48185264.69/(6447032.12*8)=93.4%

系统空闲率越大,说明系统比较闲,可以加重一些负载;而系统空闲率很小,则可能考虑升级本机器硬件或者迁移部分负载到其他机器上。

Some docs from Redhat:
The first number is the total number of seconds the system has been up. The second number is how much of that time the machine has spent idle, in seconds. (Jay’s comments: Please pay attention to SMP system.)

Linux变量数字运算符

Abstract : 

1)  Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算;
2)Linux shell 中使用 expr 与 bc 两个程序实现高级运算;


1, Linux shell 变量的基本运算


数值作为常规变量直接赋值给变量,并且以字符串形式保存。

1.1 let 命令可以用于直接执行基本操作:
        
当我使 用 let 的时候,我们不使用 $ 符号引用变量。

no1=7;
no2=8; 
echo "------------ let command -------------"
let no1++;
let no2--;
let no1+=3;
let no2-=5;
let result=no1+no2;
printf "let result=%d\n" $result; 

1.2 " [ ] "运算符跟 let 命令很相似:
"[ ]" 运算符里面可以使用 $ 符号引用变量,同时支持变量名与运算符之间不带空格。

echo "----------------- [] operator ----------------"
 
printf "no1:%d no2:%d \n" $no1 $no2;

result1=$[ no1 + no2 ];

printf "result1 = %d \n" $result1;

result2=$[no1+no2 + 7];

printf "result2 = %d \n" $result2;

result3=$[ $no1+$no2+5 ];

printf "result3 = %d \n" $result3;

no2=$[ no2 + 1 ];

printf "no1 = %d no2 = %d \n" $no1 $no2; 

1.3 " (( )) " 运算符跟 " [ ] " 运算符一样:
同样支持使用 $ 符号引用变量进行基本运算,同时支持变量名与运算符之间不带空格

echo "----------------- (( )) operator --------------"
 
printf "no1: %d no2: %d \n" $no1 $no2;

result1=$(( no1 + no2 ));

printf "result1 = %d \n" $result1;

result2=$((no1+no2+3));

printf "result2 = %d \n" $result2;

result3=$(( $no1+$no2 + 5))

printf "result3 = %d \n" $result3; 

1.4 "expr" 命令同样可以用于变量的基本运算:
"expr" 命令同样支持 $ 符号引用变量进行基本运算,但是变量与运算符之间必须使用空格作为分隔符;
在使用 "expr" 命令对变量进行运算后,整个表达式必须使用 " ·expression · " 的模式赋值给变量,即包含在 " ` " 符里面,
并且等效于 " $( expression )" 模式。

上面所述的四种shell中执行变量运算的方式中不支持浮点运算!


2, Linux shell 中使用 bc 命令实现高级数学运算:
bc 命令使用 标准输入 stdin 作为输入;
bc 是一个支持精确的浮点运算的高级计算器;
bc 拥有相当多的输入选项,并且支持数学函数调用;
执行 bc --help 自行查看 bc 所支持的输入选项;

2.1 bc 命令使用标准输入 stdin 作为输入,并且支持浮点运算:

2.2 bc 命令支持运算精度设置:

通过附加参数可以给 bc 指定运算精度;
附加参数使用分号 " ; " 作为分隔符;

实验结果所示,使用分号 " ; " 加入附加参数 scale ,指定精度为 9 位小数; 

2.3 使用 bc 进行数值的记数进制间转换:
通过 ibase=value 作为附加参数,指定输入变量的记数进制;
通过 obase=value 作为附加参数,指定输出变量的记数进制;


2.4 使用 bc 调用数学公式进行高级数学运算:
" sqrt(value) " 执行 value 的开方运算;
" value^index " 执行 value 的幂运算;

参考文档:

http://www.cnblogs.com/frydsh/p/3887357.html
http://blog.chinaunix.net/uid-20671208-id-3552751.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值