#!/bin/ksh
#发送提示信息并延时重启或关闭系统的脚本 V050724
#乐山市沙湾区邮政局 宋涛
#精简改进 V060413
#增加命令行选择重启或关闭系统 V060415
trap " tput sgr0 ; exit 0" 0 1 2 15
tput bold
delaytime=2 #默认延时重启时间
boottime=5 #重启所需的大概时间
[ "$1" = "-h" ] && { tput bel ; clear
printf "
发送提示信息并延时重启或关闭系统
调用格式: $(basename $0) [ -h ] [ time [ mode ] ]
-h: 帮助
time: 延时重启或关闭时间(0-60分钟)
mode: 执行方式,c 或 C 为重启系统, g 或 G 为关闭系统
注: time参数缺省则默认延时时间为 $delaytime 分钟,设置为 0 为立即重启或关闭
mode参数缺省则默认执行方式为 c ,即重启系统
例:
$(basename $0)
参数全部缺省则为延时${delaytime}分钟后重启系统
$(basename $0) 10c
延时10分钟后重启系统
$(basename $0) 6 G
延时6分钟后关闭系统
$(basename $0) 5
缺省mode参数,则延时5分钟后重启系统
$(basename $0) g
缺省time参数,则延时${delaytime}分钟后关闭系统
$(basename $0) 0
如当前系统只有当前用户存在,则直接重启系统,否则需确认后才重启系统
$(basename $0) 0g
如当前系统只有当前用户存在,则直接关闭系统,否则需确认后才关闭系统
" | more ; exit 0 ; }
[ "$LOGNAME" != "root" ] && { echo "\n\n SORRY 本 关 机 脚 本 只 能 由 root 执 行\n\n" ; exit 1 ; }
echo "$@" |awk '{if (match($0,/^[0-9]+/))
{ print substr($0,RSTART,RLENGTH),substr($0,RLENGTH+1) }
else print "'$delaytime'",$0 } ' | read delaytime mode
[ $delaytime -le 60 ] && delaytime=$((delaytime+1-1)) || \
{ echo "\n 延时时间过大,请输入0-60分钟以内整数\n" ; exit 1 ; }
bootstart=$((delaytime+boottime))
case ${mode:=c} in
c|C) mode="重启" ; messages=" 稍候 $bootstart 分钟之后再请登录\n" ; action="-i6" ;;
g|G) mode="关闭" ; messages=" 等待恢复通知\n" ; action="-i0" ;;
*) echo "\n 重启或关闭方式输入错误\n" ; exit 1 ;;
esac
if [ "$delaytime" -eq 0 ]
then
while :
do
if [ $(who|wc -l) -eq 1 ]
then break
else
clear
( who ; who am i ) | sort | uniq | awk 'BEGIN{printf("\n%20s\n\n %-10s%-10s\n","在线用户列表","用户名", "终端号");num=0}
{printf(" %-10s%-10s\n",$1,$2);num++} END{printf("%s%d\n\n"," 在线用户合计: ",num)}'
read yn?" 如果此时系统${mode},以上用户可能将损失数据,请确认是否继续(y/n): "
fi
case "$yn" in
y|Y)
break ;;
n|N)
echo "\n 已取消本次${mode}操作\n" ; exit 0 ;;
*)
echo "\n 输入错误,请重新输入\n" ; read ;;
esac
done
wallmessage="\n 系统正在${mode}\n${messages}"
else
wallmessage="\n 系统将于 ${delaytime} 分钟之后${mode}\n 请及时签退系统\n${messages}"
fi
echo "$wallmessage" | wall
sync ; sync
shutdown -g${delaytime} -y $action