StackOverflow提出了一个关于在Python中编写init.d脚本的问题。 一个评论指出,这些脚本应该在shell中编程,而不是Python。 在Python中编写init.d脚本:
了解任何噩梦的场景,或者这个规则是写在一些系统pipe理员的血液里,这将是非常好的。
我会说#2,但非常接近#1 – “坏,坏,坏,不要这样做”。 对于Linux初始化脚本来说,标准就是在LSB中 ,虽然它从来没有出现过,并且说“这些是Bourne shell脚本”,但还是有一些假设。 其一,以#开始的行是注释,碰巧工作正常。 更麻烦的是init脚本在当前环境中执行“ /lib/lsb/init-functions ”中的命令(请参阅shell特殊的内置命令点)。
但更重要的是,如果你在这里做的任何事情都很复杂,那你就错了。 init脚本应该非常简单实用。 它们应该是经典意义上的脚本,而不是程序。 最好是把它吸引起来,制作一个简单的shell脚本,任何系统pipe理员都可以轻松地快速查找,而不是使用Python编写漂亮的工程。
需要记住的另一个考虑因素是systemd ,这可能是也可能不是Linux上所有系统初始化的未来。 在systemd下,初始化是通过简单的configuration文件而不是脚本完成的,想法是所有的启动都符合几个标准的devise模式,而且真的只需要select一个。 如果你的程序使用了一些复杂的初始化,它应该超出init脚本本身。
我没有看到它的问题,如果你知道的话,当init.d脚本运行时,Python解释器将是可用的。 对我而言,这表示您正在查看多用户(或“graphics控制台”)运行级别相对较晚的事情。
但是…这意味着Python解释器的特定版本可能对您的启动顺序至关重要,这是您需要在升级时检查的另一个版本。
我想这意味着我说“3.好,注意事项”。
我同意“3.好,注意事项”,但出于不同的原因。 我在Solaris上的经验是,他们有一些内部程序的Perl操作系统副本。 shell脚本只不过是让shell启动而已。 启动脚本是否必须写在SH? 不,但它改善了pipe理员的可维护性。 而且init脚本并没有像daemon --start那样复杂 – 启动或daemon --stop 。 如果你这样做了,那么普通用户可以在非特权模式下启动你的工具,如果你的程序是有意义的。 而且他们不需要有各种复杂的设置来devise。
现代的Linux发行版,甚至那些仍然使用init.d ,都有大量的预构build函数,这样可以很容易地pipe理守护进程。 graphics启动过程经常利用这些function来保持漂亮的标志,除非其中一个启动脚本开始喷出错误。 你的Python代码(或任何其他语言)可能不适合这些scheme。
如果你不关心美学或可维护性,你的初始化脚本可以写成你想要的。 我见过很多pipe理员,甚至无法正确剪切和粘贴,完全忽略命令行参数,只是启动守护进程。 没有关机,状态或重新启动。 这是不成熟的,但他们的代码仍然运行。
我在#1-2之间说。 LSB以这种方式引导你…从Sys-Admin(非开发angular色)的工作请求指令sh / bash的知识,而不是开发级别(甚至是轻松的理解)的Python,PHP或Perl。 这是LAMP堆栈,而不是系统init脚本。