我想我遇到的问题一部分是术语问题,一部分是普通的新手问题,一部分是厌倦阅读的问题。
我的家庭能源监测项目已经取得了很大进展,从使 SDR 无线电工作、解码数据、将 json 推送到 InfluxDB、运行 Grafana 和获取图表!所有这些都是通过谷歌搜索完成的,因为我的 Linux 使用经验还不到 2 个月(只是玩玩 Raspberry Pi/OrangePi)。
我的 OrangePi 运行的是 Armbian Ubuntu 16.04
我需要一个非常简单的“命令”在启动时执行。它将一直在后台运行。所以我想这会使其成为守护进程?命令是
/home/jonboy545/GoCode/bin/rtlamr -filterid=62059972 -format=json -msgtype=idm unique=true | rtlamr-collect
就是这样。我制作了一个名为 log_energy.sh 的简单脚本,并使其可执行。它只是:
#!/bin/bashr
/home/jonboy545/GoCode/bin/rtlamr -filterid=62059972 -format=json -msgtype=idm unique=true | rtlamr-collect;
如果我在终端窗口中输入 ./log_energy.sh,一切都会顺利进行。我必须打开一个 SCREEN 实例,这样我就可以将其分离,这样我就不必让终端保持打开状态。显然这不是最好的解决方案。
那么,我是否应该将其放入 rc.local?我遇到了一些问题,我认为它执行得太早了,所以我尝试在其中放入 sleep 60,但它仍然不稳定。有时它有效,有时无效。所以我考虑使用 crontab 并让它执行 @reboot。同样,这可能不是最好的解决方案。此外,还有一些必须声明并设置在 ~/.profile 中的环境变量(我猜它们可以放在任何地方),我不确定 crontab 是否“读取”了这些环境变量,至少这是我读到的。
那么,让这个脚本在启动时执行的“正确”方法是什么(也许是在最后,一旦一切都“安定下来”)。
最终,我希望将其作为一个名为“energylog”的“服务”,以便我可以执行 sudo service energylog start/stop/restart。
我查看了 /etc/init.d/skeleton 以及 /etc/init.d 中一些已经存在的文件,但我并不确定我在看什么。
有人能给我指明正确的方向吗?
非常感谢!
答案1
我猜想问题的一部分在于存在/曾经存在几种在启动时运行应用程序的方法。
A守护进程有点像旧的 DOS TSR - 它是一种在后台启动并运行的应用程序。
执行此操作的“经典”方法是使用 init 脚本(编写起来有点复杂) - 但这些脚本已经过时了,或者使用 crontab - 它实际上只是一个设计用于一次运行特定任务的东西。
这服务命令指的是 upstart,它处理 init 脚本所做的工作,但在 16.04 中,它被 systemd 取代。对于从 upstart 过渡到 systemd 的人来说,它可用于 systemd,但值得将“service”替换为“systemctl”——它的作用相同,甚至更多。
为 systemd 编写脚本。
为什么?因为它受支持,而且会长期支持。它的语法非常合理。文档实际上也相当不错。
另外,还有一些必须声明并设置在 ~/.profile 中的环境变量(我猜它们可以放在任何地方),并且我不确定 crontab 是否“读取”了这些环境变量,至少这是我读到的。
根据systemd 文档(以及进一步阅读 -这个 AU 问题以及 Ubuntu 的文档)
您可以添加一行环境变量,例如
环境="ONE=one" ‘TWO=two two’
您还可以以特定用户身份或在特定时间启动它。您甚至可以简单地自动重启它