作者:蔡冰
truss是aix系统下一个非常好用的命令。它可以用来跟踪系统调用、动态装入的用户级函数调用、接收的信号和造成的机器故障等。每行跟踪输出报告fault或者signal名称或者syscall名称和参数及返回值。
aix系统中有个功能非常强大的sar命令,可以用来监控系统资源使用情况。遗憾的是对于普通非管理员或者管理员同组的用户该命令是无法使用的。普通用户执行sar -d 1 1命令会得到如下输出:
test1:/>sar: The file access permissions do not allow the specified action
但是查看sar命令文件权限默认权限如下:
home/test1>ls -l /usr/sbin/sar
-r-xr-xr-x 1 bin bin 126642 May 04 2013 /usr/sbin/sar
对所有用户权限是一致的。所以sar命令文件本身权限不是导致命令不可用的原因。
下面我们就用truss命令来查看普通用户不能使用该命令的原因以及解决方法。
切换至普通用户执行truss sar -d 1 1命令可看到如下输出,截取其中一部分。
__loadx(0x01480080, 0x2FF20F70, 0x00000A50, 0x2FF21AD0, 0x00000000) = 0xD0546128
access("/usr/lib/nls/msg/en_US/sar.cat", 0) = 0
_getpid() = 2359968
corral_getcid() = 0
access("/usr/lib/sa/sadc", 01) Err#13 EACCES
access("/usr/lib/nls/msg/en_US/libc.cat", 0) = 0
_getpid() = 2359968
kopen("/usr/lib/nls/msg/en_US/libc.cat", O_RDONLY) = 3
kioctl(3, 22528, 0x00000000, 0x00000000) Err#25 ENOTTY
kfcntl(3, F_SETFD, 0x00000001) = 0
kioctl(3, 22528, 0x00000000, 0x00000000) Err#25 ENOTTY
kread(3, "\\0\\001 007\\007 I S O 8".., 4096) = 4096
lseek(3, 0, 1) = 4096
lseek(3, 0, 1) = 4096
lseek(3, 0, 1) = 4096
_getpid() = 2359968
lseek(3, 0, 1) = 4096
close(3) = 0
sarkwrite(2, " s a r", 3) = 3
: kwrite(2, " : ", 2) = 2
The file access permissions do not allow the specified action.kwrite(2, " T h e f i l e a c c".., 62) = 62
kwrite(2, "\\n", 1) = 1
__loadx(0x04400000, 0x2FF219A0, 0x00000800, 0x0000D032, 0x00000000) = 0x00000000
kfcntl(1, F_GETFL, 0x108D02A3) = 67110914
kfcntl(2, F_GETFL, 0x108D02A3) = 67110914
_exit(1)
从输出中我们可以看到上面输出中出现如下字段
access("/usr/lib/sa/sadc", 01) Err#13 EACCES
访问/usr/lib/sa/sadc文件时出现Err#13 EACCES报错。该报错代码解释我们可以查看系统/usr/include/errno.h中的定义,定义如下:
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Resource temporarily unavailable */
#define ENOMEM 12 /* Not enough space */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
可见当前普通用户访问该权限被拒绝。我们再查看一下该文件的权限:
test1:/home/test1>ls -l /usr/lib/sa/sadc
-r-sr-x--- 1 root adm 23446 May 04 2013 /usr/lib/sa/sadc
显示其他用户对该文件目录没有rx权限。接下来我们尝试修改该文件权限给test1用户赋予一个rx权限。
test1@xxhjibm0401:/home/test1>chmod o+rx /usr/lib/sa/sadc
再次确认新权限,
:/home/test1>ls -l /usr/lib/sa/sadc
-r-sr-xr-x 1 root adm 23446 May 04 2013 /usr/lib/sa/sadc
接下来普通用户再次执行sar命令:
Test1:/>sar -d 1 1
AIX xxhjibm0401 1 7 00CF16214C00 12/20/17
System configuration: lcpu=16 drives=8 mode=Capped
15:57:45 device %busy avque r+w/s Kbs/s avwait avserv
15:57:46 hdisk6 0 0.0 0 0 0.0 0.0
hdisk2 0 0.0 0 0 0.0 0.0
hdisk5 0 0.0 0 0 0.0 0.0
hdisk4 0 0.0 0 0 0.0 0.0
hdisk3 0 0.0 0 0 0.0 0.0
hdisk1 0 0.0 0 0 0.0 0.0
hdisk0 0 0.0 0 0 0.0 0.0
cd0 0 0.0 0 0 0.0 0.0
ok执行成功。
备注: 系统出入安全考虑默认可执行权限只放给了特权用户。本文仅用于举例展示.不建议更改权限.想了解更多相关权限信息的,参考IBM “Security”相关红皮书。
曾经管理的一套系统,当时有反馈应用异常。登录主机执行topas查看系统各项资源均正常,查看系统各项指标,也没有任何性能瓶颈。出于习惯,按照cpu,内存,io等顺序采集并查看详细信息.
首先采集了一个30秒的系统进程cpu消耗情况:
Tprox –x sleep 30截取部分内容如下:
Process PID TID Total Kernel User Shared Other
======= === === ===== ====== ==== ====== =====
wait 28686 28687 8.64 8.64 0.00 0.00 0.00
wait 24588 24589 7.97 7.97 0.00 0.00 0.00
wait 12294 12295 7.16 7.16 0.00 0.00 0.00
wait 20490 20491 6.93 6.93 0.00 0.00 0.00
wait 8196 8197 6.79 6.79 0.00 0.00 0.00
wait 16392 16393 6.55 6.55 0.00 0.00 0.00
/usr/bin/amqcrsta 3788942 155748 1.39 1.37 0.01 0.01 0.00
MQConvAppTux 6635612 47738901 0.63 0.07 0.02 0.54 0.00
MQFrntAppTux 5529794 4886717 0.61 0.09 0.01 0.51 0.00
MQFrntAppTux 7127044 12812523 0.52 0.07 0.02 0.44 0.00
MQFrntAppTux 4509822 11493569 0.49 0.07 0.02 0.41 0.00
MQFrntAppTux 7807098 55529551 0.48 0.04 0.01 0.43 0.00
从中明显看出/usr/bin/amqcrsta的应用进程占用系统cpu异常,几乎全部为kernel占用。接下来用truss跟踪一下进程看进程的工作情况:
Truss –p 3788942输入如下
kill(1683670, 0) = 0
kill(5709840, 0) = 0
thread_tsleep(1000, 0xF125C34C, 0x00000000) = 1
yield() =
thread_waitact(400) = 1
kread(3, " T S H \\0\\007 ?186 0\\0".., 32766) = 1460
kread(3, " < n a m e > ??????.., 31306) Err#11 EAGAIN
_select(4, 0x2FF1CC50, 0x00000000, 0x00000000, 0x2FF1CC40) = 1
yield() =
thread_waitact(400) = 1
kread(3, " < / U N I T _ P O S T C".., 31306) = 554
sigprocmask(0, 0x00000000, 0x2000ABF4) = 0
__semop(131226, 0x2FF20960, 1) = 0
__semop(131226, 0x2FF20974, 1) = 0
kwrite(3, " T S H \\0\\002 40196 0\\0".., 564) = 564
kread(3, " T S H \\0\\001 ?185 0\\0".., 32766) = 492
sigprocmask(0, 0x00000000, 0x2000ABF4) = 0
__semop(131226, 0x2FF20AD0, 1) = 0
__semop(131226, 0x2FF20AE4, 1) = 1
yield() =
thread_waitact(400) = 0
该进程报了一个err#11 EAGAIN (Resource temporarily unavailable)的错误。然后程序每隔400毫秒等待激活,陷入死循环情况。
ps –ef|grep 3788942进程如下
mqm 3788942 155748 0 10:48:05 - 0:01 amqcrsta -m QM_GW_IN
是应用MQ的一个进程异常.联系应用人员应急处理并重启MQ后恢复正常。
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞9
添加新评论2 条评论
2018-01-12 19:43
2018-01-10 09:24