我想创建一个完全自动化的盒子(基于 Raspberry-Pi 或 OLinuXino 卡等)。
我的机器将运行基于 Debian 的系统,带有只读文件系统和 ramdisk(以避免 SD 卡损坏)。
我想创建一个脚本,每次打开盒子或插入网络时,该脚本都会自动连接到远程服务器(通过 ssh)。
为此,我认为最简单的解决方案是创建一个作为守护进程运行的 shell 脚本。该守护进程必须保持活动状态,直到盒子关闭或与网络断开连接。当网络启动或盒子重新启动时,脚本应该能够重新连接。
问题:您认为 shell 脚本足够安全来执行此操作吗?或者我应该更好地使用另一种(更安全的)编程语言(PERL,C,...)?
答案1
许多守护进程使用 bash 作为脚本语言来运行。使用它不会有任何问题。
答案2
一般来说,在 bash(或一般的 shell 脚本)中创建守护进程是相当棘手的。有些问题(例如后台分叉、输出和错误消息重定向或信号处理)并不容易解决。
对于您描述的具体问题,已经有一些(免费)软件可以与 respawn 进行自动 ssh 连接。
我用autossh
以此目的。它是在 Debian 中打包的并且运行良好。
答案3
bash
它非常安全,但除非能够处理清理工作,否则它的用处可能不大。如果它因任何原因被杀死,脚本需要能够自行exec
更新,以便根据需要刷新其状态 - 您可能不想简单地执行以下操作:
while :
...例如。那很快就会变老。相反,也许可以做类似的事情:
trap '' HUP EXIT
set_state() { echo stuff="'$(otherstuff)'"... ; }
chk_interval() { wait for something... ; }
exec_me() { exec env - $(set_state) "$0" <in >out 2>alsoout & ; }
chk_interval
exec_me
它还可能取决于谁在进行清理工作。这最简单的实现守护进程的方法如下:
init=path/to/executable/script
...在内核命令行上,用于特别单一目的的安装。这里推断的相对值/
是 initramfs /
。