Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103116149
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-18 23:35:05

作者:styr  出处:Unix爱好者家园unix-cd.com   

#!/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

阅读(442) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~