我需要了解 Linux 上的 init.d 系统(我使用的是 Ubuntu 12.04,64 位),我找到了数百个网站(我没有全部看完,但我确实读过其中一些),它们告诉我如何编写 init.d 脚本以及如何在 /etc/rc2.d 中创建符号链接。我仍然对理解和编写 Google 查询的能力有些欠缺,这些查询可以给我提供所需的答案。因此,
我知道我的 init.d 脚本已启动。我让它将日志消息回显到文件中,因此我知道它正在运行,例如在任何用户的 .profile 运行之前。问题是,它执行的环境的性质是什么。发送到 STDOUT 的输出会发生什么?它会写入某个虚拟终端吗?它会产生什么影响吗?
我实际上想从 init.d 脚本启动的“程序”是一个 shell 脚本,我的shell脚本,围绕着我的真实程序,我的程序。该脚本设置了一系列环境变量,包括小路和LD_LIBRARY_PATH,然后启动我的程序。
我应该修改启动的行吗我的程序将其输出重定向到 /dev/null?STDERR 也是如此?启动行是否应具有 NULL <1(或者是 NULL <&1?)以便 STDIN 断开连接?
在我的 init.d 脚本中,当我想要启动 shell 脚本时,调用它的正确方法是什么?
my_shell_script
或者
. my_shell_script
或者
sh my_shell_script
我应该使用 sh 还是 bash?我猜应该使用使脚本运行所需的那个?即如果其中有非 sh bash,则使用 bash?
当 init.d 脚本尝试启动时我的shell脚本是否需要对 STDIN、STDERR 和 STDOUT 进行相同的重定向?
现在,my_program 最初是作为带有一个图形窗口的终端启动程序开发的。主程序启动图形窗口,然后启动两个 xterm,其中运行着单独的程序(我不知道为什么,我继承了它。)所有三个程序都永远运行,但不是守护进程:只是无限循环。主程序监视以确保其他两个程序正在运行,如果它们确实停止了,将重新启动它们。
我启动的程序应该是守护进程吗?还是非终止应用程序可以?在启动行中我的shell脚本rmd 用 & 以便脚本可以继续启动并返回到 init.d 脚本?
我的程序,检测到图形窗口可以/无法启动(因此我可以通过 telnet/ssh 进入运行它的服务器并(重新)启动它)。如果它没有运行 GUI 窗口,它会在同一个终端(telnet)窗口中启动另外两个子程序,并且所有图形输出都作为非图形文本输出发送到该终端和日志文件。
当我通过 ssh/telnet 进入我的开发服务器时。轮廓会跑,。轮廓几乎包含所有内容我的shell脚本包含,但使用屏幕程序启动我的程序这样从 telnet/ssh 会话注销不会终止正在运行的我的程序我需要将屏幕程序包裹起来吗我的程序在 init.d 方案中。
init.d 时间环境看起来像终端吗?我假设它看起来像运行级别 1 环境,并且无法打开 GUI 窗口,并且“终端”是唯一的输出。
最后,停止正在运行的应用程序的最佳方法是什么?现在,当它们作为用户应用程序运行时,我使用 killall 来阻止它们,因为没有办法告诉它们自行关闭。
答案1
http://upstart.ubuntu.com/cookbook/
Upstart 是 Ubuntu 的初始化系统。该指南应该会有所帮助。
如果您想连接到从 init 系统启动的终端,您最有可能想尝试一下 tmux。