我希望出现以下情况:
按钮1:点亮持续30分钟
按钮2:灯熄灭
按钮3:灯始终亮起
按钮4:召唤克苏鲁
每个按钮都会覆盖上一个操作(按钮3->按钮1 =开启30分钟)
对按钮进行接线和编程很容易,但是现在计时器又如何呢?我想避免创建自制服务,因为我害怕弄乱
init.d
。我有3种可能性:
Domoticz虚拟交换机
Domoticz允许创建虚拟服务器可以在界面中给定的时间后改变状态的开关:
专业版
现成的计时器!
我可以在墙壁之间快速交互开关和灯
缺点
尽管Domoticz处理MQTT,但是会有很多LUA脚本和“块状”来互连设备
时间可能并不容易可配置...
at
和atq
at
是一个Linux命令,用于及时计划一个动作,就像一样简单
at [when] < [what]
优点
多计时器服务
易于使用和调用
缺点
仅给出唯一的ID ,除非解析计划的命令,否则我无法为作业命名(除非使用神奇的linux命令...)
,因此我需要对作业进行编码/实现使用数据库
Crontab
Crontab是用于计划重复任务的linux服务。就我而言,这将是一个简单的方法。
专业人士
可靠的时间触发器
缺点
无法管理秒数。 ..
还是被迫在某处维持工作匹配器
对我的问题:
您是否必须管理这种计时器?
/>我是否想念其他更可靠/可配置的解决方案?
您是否对上述解决方案有偏爱?
#1 楼
根据请求,我将尝试举例说明如何解决该问题(使用bash外壳jobs
处理):按钮1:
打开X灯30秒钟并打开灯时Y持续5分钟:
echo "Switch on lamp_x" && sleep 30s && echo "Switch off lamp_x" &
echo "Switch on lamp_y" && sleep 5m && echo "Switch off lamp_y" &
由于工艺限制,必须在两条单独的线上,上面的回显显然应由实际命令代替。 >
按钮3:
然后您就可以通过休眠和杀死Q4312079q来使其停止并保持亮起:
kill $(jobs -p %?lamp_y)
echo "Switch on lamp_y"
由
kill
链接命令的事实将阻止&&
之后的命令运行,因为睡眠无法正确退出。这不能处理不存在的作业,这可能会导致kill返回错误,没有什么不好的
按钮2:
使用与按钮3相同的方法,但使用stop命令并杀死作业(如果有的话)。
按钮4:
echo "Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn"
(对不起,我不知道您在这里想要什么,设置完整)
关于
sleep
的实现的详细信息:jobs
返回与jobspec jobs -p %?lamp_y
匹配的作业的当前pid -p
,这意味着%?lamp_y
可能出现在命令行中的任何位置,请仔细选择在此处使用的内容(但我敢打赌,您对要控制的事物或事物组具有唯一的标识符)。评论
我不是自愿测试您对按钮4的实现。
– Sean Houlihane
17年4月21日在9:13
一名班轮杀人工作是完美的!谢谢!顺便说一句,我尝试了按钮4的实现,现在我所有的灯都闪烁了,到处都是令人毛骨悚然的声音,非常适合万圣节派对!
–古法利特
17年4月24日在12:03
@Goufalite很高兴它有所帮助
–滕西拜
17-4-24在12:05
Protip:使用真正的taskid &&启动命令,以便您轻松跟踪工作!不幸的是,如果PHP或其他程序调用该命令,则此命令将不起作用,因为它将作为子shell启动。
–古法利特
18年2月16日在9:58
#2 楼
如果要为此使用在线服务,则应该能够使用https://www.stringify.com。它们支持序列和变量(和计时器)。我没有激怒他们的服务,但是看来您应该可以使用计时器来递减变量(确定剩余的按时),并且各种触发事件可以将变量强制为新值。 br />它们支持IFTTT集成,因此几乎任何端点都可以通过某种方式链接。
#3 楼
我发现另一种相当昂贵的方法,但是可以使用外部流程(例如PHP的system
):屏幕首先,安装它:
sudo apt-get install screen
然后调用您的函数
screen -dm -S taskid bash -c 'sleep 20 && command'
-dm : detach process
-S : identify screen by name
列出您的任务
ls /var/run/screen/S-www-data (or S-anotheruser, warning it is user bound, or sudo it)
杀死它
screen -S taskid -X kill
-S : identify screen by name
-X : access the screen and perform this command
评论
只是使用sleep或usleep来触发关闭?它是at的基础功能,您可以使用作业来处理后台作业(如果我理解正确,主要是取消计划中的作业)睡眠看起来更糟:您只经过一段时间,却什么也没有返回。您可以使用作业回答并给出示例吗?