-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathidle
executable file
·58 lines (44 loc) · 1.13 KB
/
idle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#!/bin/bash
###
# 显示闲置用户,参数是闲置阈值(秒),默认半小时
# 输出闲置超过阈值的用户名,每行一个
# 如果不在管道中,标准错误会输出更多信息
###
CURRENT="$(date +%s)"
declare -A TIMEOUT_LIST
declare -A NOT_TIMEOUT_LIST
SECONDS="${1-1800}"
TTY=/bin/false
if [ -t 1 ] && [ -t 0 ] ; then
TTY=/bin/true
fi
function calc () {
local UNAME="$1"
local DEV="/dev/$2"
local LAST_ACC="$(stat -c "%X" "$DEV")"
local IDLE="$(( $CURRENT - $LAST_ACC ))"
$TTY && echo -n "$UNAME: ${IDLE} > ${SECONDS} ? :" >&2
if [ "${IDLE}" -gt "${SECONDS}" ]; then
$TTY && echo "timeout" >&2
TIMEOUT_LIST[$UNAME]="yes"
else
$TTY && echo "not timeout" >&2
NOT_TIMEOUT_LIST[$UNAME]="yes"
fi
}
WHO="$(who -s | grep 'pts/')"
USER_LIST=($(echo "$WHO" | awk '{print $1}'))
PTS_LIST=($(echo "$WHO" | awk '{print $2}'))
for I in "${!PTS_LIST[@]}"
do
calc "${USER_LIST[$I]}" "${PTS_LIST[$I]}"
done
for USER in "${!TIMEOUT_LIST[@]}"
do
if [ -n "${NOT_TIMEOUT_LIST[$USER]}" ]; then
$TTY && echo "User is active: $USER" >&2
continue
fi
echo "$USER"
$TTY && echo "User is TIMEOUT: $USER" >&2
done