我有一个树莓派,在上面运行一些服务。我需要能够 ssh 进入机器并监控这些服务。目前,我所做的是登录、运行screen
,然后创建三个窗口,并在每个窗口中运行运行相关服务的脚本。其中两个实际上以 root 身份运行(一个监视网络,另一个监视连接到 pi 的某些硬件)。第三个是运行实际的服务,并在我的用户中运行。 (第二个基本上是硬件与第三个对话的代理。)
无论如何,这都很有效,除了当 pi 由于某种原因(例如电源故障)重新启动时,我必须重新设置所有这些,这很乏味。
我希望系统screen
在我的用户中运行或自动启动,创建三个窗口,两个以 root 身份运行的进程,一个在我的用户中运行,这样当我登录时,我可以连接到该屏幕会话并看到所有内容直播运行。
我该怎么做呢?
答案1
正如 @DavidDai 在他的评论中提到的,最好将它们作为系统服务运行(例如,通过为它们创建 systemd 服务文件或 sysvinit 启动脚本)。不过,说起来容易做起来难。
可以继续使用屏幕进行操作。您只需要为屏幕创建一个配置文件,并使用screen -c /path/to/screen/config
(覆盖默认~/.screenrc
配置文件)。
screen -t monitor1 0 sudo /path/to/monitor1.sh args
screen -t monitor2 1 sudo /path/to/monitor2.sh args
screen -t server 2 /path/to/service/script.sh
如果您希望它以特定的活动窗口开始,您可以添加如下行:
select 1
man screen
详情请参阅。
您还需要进行配置sudo
以允许您的用户以 root 身份运行monitor1.sh
和monitor2.sh
。
当您的 rpi 重新启动时,这不会自动启动。您必须screen
手动登录并启动。要在您的 uid 下自动启动,您可以从 crontab 条目运行它@reboot
(man 5 crontab
详细信息请参阅 参考资料)。
您可以作为您的用户附加到此屏幕会话。
或者,您可以以 root 身份运行一个独立的屏幕(例如screen -d -m -c /path/to/config
)(例如从上面/etc/rc.local
或cron
如上所述),然后sudo
从前两个窗口中删除,并将其添加到最后一个:
screen -t monitor1 0 /path/to/monitor1.sh args
screen -t monitor2 1 /path/to/monitor2.sh args
screen -t server 2 sudo -u username /path/to/service/script.sh
每当 rpi 重新启动时,它就会自动启动。您必须是 root 才能附加到此屏幕会话。
最后,如果您的监控脚本不需要以 root 身份运行,您应该以权限较低的用户身份运行它们。也许创建一个新用户并将他们添加到一个组中,该组具有对他们需要监视的任何内容的读取权限。
答案2
该脚本将在重新启动时启动屏幕,就像您手动创建它们一样:
#!/bin/bash -il
# To install:
# - put this file somewhere in your home directory like ~/start-screens
# - chmod a+x ~/start-screens
# - run "crontab -e" and add this line:
# @reboot /bin/bash -li ~/start-screens
start() { screen -s "/bin/bash" -dmS "$1"; screen -S "$1" -X stuff "$2\n$3\n"; }
# Now define your screens to start here:
start service1 "cd dir1" "node index.js"
start service2 "cd dir2" "node index.js"
将其放入您的主目录,然后按照有关如何将其添加到 crontab -e 的说明进行操作。