Linux 下定时唤醒计算机

本意是把笔记本当闹钟用,在windows下也很容易实现, linux 下试过,效果不是特别好,不过还是总结一下。

基本命令是 rtcwake ,该命令需要根权限,所以最好是安装sudo。 因为一直用ubuntu,所以也就不用操心这个了。rtcwake 的基本使用格式如下:

rtcwake -m [type of suspend] -s [number of seconds]

其中 -m 后面的参数描述睡眠模式,支持如下几种

  • standby -- 该模式貌似只是关闭显示器
  • mem -- 该模式等效于windows下的待机,就是把内容放内存了
  • disk -- 该模式等效于windows下的休眠,把内容放硬盘
  • off -- 该模式等效于完全关机,虽然ACPI不提供官方支持,但是该模式 在许多计算机上是可以用的,具体情况得在具体机器上试验一下。
  • no -- 该模式并不立即待机,只是设置一个唤醒时间。在此模式下, 可以手动待机。比如设置第二天早上7:00自动唤醒,然后临睡前手动待机。

而 -s 后面的参数则表示休眠的时间(按秒计算)。

 

此外,还可以利用 -t 参数和 -l 参数结合 date 命令来指定特定的唤醒时间。 当使用 -t 参数时,后面的数字给出唤醒时间与00:00:00 UTC Jan 1, 1970 之间的 时间差(按秒计算)。而 -l 参数则表明系统硬件时钟为本地时间。( -u 参数 表明系统硬件时钟为UTC时间,Linux系统通常设置硬件时钟为UTC时间,然后将之 转换为本地时间。) 利用这两个参数,可以设置计算机第二天7:00am 自动唤醒, 但并不立即待机。

sudo rtcwake -m no -l -t $(date +%s -d 'tomorrow 07:00')

此处我们假定硬件时间为本地时间。

 

还可以利用 && 在唤醒计算机后执行某命令,例如

rtcwake -m mem -s 120 && firefox

将使计算机待机两分钟后自动唤醒并运行firefox。

 

结合crontab 即可实现我将笔记本电脑变成闹钟的需求。 比如在crontab中设置每天晚上十点执行

rtcwake -m no -s 28800

即可保证第二天6:00am计算机自动唤醒,此时计算机仍可继续使用, 直到被手动待机。可以在crontab中设置每天6:30am 运行媒体播放器放音乐, 那么闹钟即可实现。

 

需要注意的是,由于缺乏驱动,某些模式可能无法正确工作,需要在具体 机器上进行测试。

免输密码执行sudo

由于rtcwake 需要根权限,因此将之放入crontab时需要利用sudo,且 在此情形下无法人工输入密码。此时可以利用 sudo 命令的 -S 参数来实现 免输密运行rtcwake。范例如下:

echo "password" | sudo -S rtcwake -m mem -s 3600

其中 "password" 为当前用户的登录密码。执行该命令后,计算机将待机一小时。 注意此方法存在安全隐患,不过鉴于使用的是个人计算机,因此也无所谓了。

 

crontab 的使用

顺便说说crontab的使用。crontab用来执行周期性命令,其命令格式如下:

crontab [OPTIONS] [file]

其中OPTIONS可以为如下选项:

  • -e [UserName] 编辑当前(或用户UserName)日程表,如没有则创建。
  • -r [UserName] 删除当前(或用户UserName)日程表。
  • -l [UserName] 列出当前(或用户UserName)日程表。
  • -v [UserName] 列出当前(或用户UserName)日程命令的状态。

日程表格式如下:

f1 f2 f3 f4 f5 program

其中f1表示分钟,f2表示小时,f3表示一个月中的第几天,f4表示月份,f5表示 一周中的第几天,program表示要执行的程序。当时间的值为"*"时,表示任意 分钟,任意小时,任意天等;当时间的值为"a-b"时,表示从第a分钟到第b分钟, 从第a小时到第b小时,从第a天到第b天等;当时间的值为"*/n"时,表示每n分钟, 每n小时,每n天执行一次等;当时间的值为"a,b,c,..."时,表示第a,b,c,…… 分钟,第a,b,c,……小时,第a,b,c,……天要执行等。也可以将日程放在文件 中,利用

crontab FileName

来设定日程表。下面给出一些例子:
在一月,二月,七月和八月,每隔十天的上午6点到晚上23点,每分钟执行一次ls。 注意该命令只在每周日到每周五期间每隔两天执行,即周日,周二,周四执行。

* 6-23 */10 1,2,7,8 0-5/2 ls > /dev/null 2>&1

需要注意的是,每次执行命令后,系统会寄一封邮件给执行命令的用户, 显示执行的内容和结果。若不希望收到该邮件,在命令后加" > /dev/null 2>&1"。 此外,"%"被认为是换行符,因此若是命令行中出现"%"符号,需要用"\"进行转义。 例如:

date +%Y%m%d

需替换为

date +\%Y\%m\%d

周几和月份也可以用英文缩写来表示,例如Mon, Tue, Wed, Thu, Fri, Sat, Sun 表示周一到周日,Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec 表示一月到十二月。

 

输出重定向

顺便说说输出重定向问题。上面例子中的

program > /dev/null 2>&1

在很多地方都可以用到,其中">"代表将输出重新定向,例如

echo "abc123" > file.txt

表示将"abc123"这一字符串写入文件file.txt(这会导致file.txt之前的内容被抹掉, 如果只是想将该内容放在文件末尾,可用">>"代替">")。"/dev/null"代表空设备文件, 重定向到该文件的内容将消失不复存在(当然也就不会显示)。1表示stdout标准输出, "> /dev/null"等价于"1 > /dev/null"。2表示stderr标准错误,& 类似于取地址操作, 故"2>&1"意味着将2(标准错误)重定向输出到1(标准输出)输出的地址, 即标准错误输出重定向等同于标准输出。这两句合在一起,表示标准输出和标准错误 都重定向到空文件,因此不会有任何输出。

 

date 命令

上面用到date命令,此处稍微说一下其用法。注意上面之所以用"$()"把 date命令括起来,是一个命令替换,表示用括号内的运行结果定义一个变量, 并把这个变量放在相应位置。此命令替换也可以用反引号 "`date +%s -d 'tomorrow 07:00'`"来代替, 表示把反引号内的语句执行之后的结果放在反引号所在的位置。注意反引号在 键盘左上角esc键下方tab键上方,不要和单引号"'"相混淆。
date命令格式如下

date [-u] [-d datestr] [-s datestr] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]]

该命令可用于设定或显示系统时间。当用于显示时,可设定显示格式,语法为 加号后接标记,可用标记如下:
%H: 小时(00-23)
%I: 小时(01-12)
%k: 小时(0-23)
%l: 小时(1-12)
%M: 分钟(00-59)
%p: 显示本地AM或PM
%r: 直接显示时间(12小时制,hh:mm:ss [AP]M)
%s: 从1970年1月1日00:00:00 UTC到目前为止的秒数
%S: 秒(00-60)
%T: 直接显示时间(24小时制)
%X: 相当于%H:%M:%S
%a: 星期几(Sun-Sat)
%A: 星期几(Sunday-Saturday)
%b: 月份(Jan-Dec)
%B: 月份(January-December)
%c: 直接显示日期与时间
%d: 日(01-31)
%D: 直接显示日期(mm/dd/yy)
%j: 一年中的第几天(001-366)
%m: 月份(01-12)
%U: 一年中的第几周(00-53,以Sunday为一周中的第一天)
%w: 一周中的第几天(0-6)
%W: 一年中的第几周(00-53,以Monday为一周中的第一天)
%x: 直接显示日期(mm/dd/yy)
%y: 年份的最后两位数字(00.99)
%Y: 完整年份(0000-9999)
若是不以加号作为开头,则表示要设定时间,而时间格式为MMDDhhmm[[CC]YY][.ss], 其中MM为月份,DD为日,hh为小时,mm为分钟,CC为年份前两位数字, YY为年份后两位数字,ss为秒数。
date命令参数如下:

  • -d datestr: 显示datestr中所设定的时间
  • -s datestr: 将系统时间设为datestr中所设定的时间
  • -u: 显示目前的格林威治时间

 

转载于:https://my.oschina.net/propagator/blog/849937

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值