在 OpenSuse 12.1 上将项目添加到 inittab

在 OpenSuse 12.1 上将项目添加到 inittab

我目前正在开发一个项目,需要添加该项目inittab以便程序在启动期间加载。

我尝试启动的程序是 ac# mono 应用程序。我已经创建了一个启动脚本,如果手动运行启动脚本,则程序可以正常启动。但是,当我将其放入inittab该程序时,该程序无法启动。

我已经检查过了,/var/log/messages但没有说有什么问题,只是说正在重新加载。

以下是我添加到inittab脚本中的内容

bes:2345:respawn:/home/bits/MyProgram/start.myprogram

感谢您的任何帮助,您可以提供

更新 以下是位于 /home/bits/MyProgram 中的启动脚本中的代码。

#!/bin/sh

cd /home/bits/MyProgram

/usr/bin/mono EmailServer.exe "$@"

我还尝试将 > mylog.txt 添加到以 /usr/bin/mono 开头的行的末尾,例如

/usr/bin/mono EmailServer.exe "$@" > mylog.txt

如果我手动运行启动脚本,即使我不在启动脚本所在的目录中,它也可以正常工作,只是当我将其添加到 inittab 并运行 telinit q 时,它永远不会启动,并且不会写入日志,但是如果我手动启动程序,日志确实会被写入。

感谢您的任何帮助,您可以提供。

答案1

把你的程序放在某个地方。

复制并编辑位于以下位置的初始化作业控制的框架模板文件:/etc/init.d/骨骼

修改此文件以指示您想要哪个运行级别...在您的示例中,您想要 2,3,4,5,文件顶部(在注释中)有选项来指示所需的运行级别

将这个新文件放入/etc/init.d具有描述性名称。 (我的名字示例中使用)

一种与平台无关的方法来测试这一点,或者启用/禁用(如果您使用骨骼文件)

sudo /etc/init.d/myfancyname start
sudo /etc/init.d/myfancyname stop
sudo /etc/init.d/myfancyname restart

有特定于发行版的方法来执行这些相同的操作,例如,Debian 使用update-rc.d myfancyname [开始|停止|启用|禁用...]

修改inittab为一般来说A坏的想法,如果你搞砸了,系统将不再启动,然后你就会遇到两个问题。 (不需要正则表达式!)

将脚本添加到 /etc/init.d/ 子目录更加标准化,可以与几乎任何 Linux 风格一起使用,可能是一些 *nix 的,也可能是一些 bsd 的。

答案2

问题很简单,您使用的是 OpenSuse 12.1用途 系统而不是你的经典System V引导系统

要安装新的服务位置,请在 /etc/systemd/system/myprogname.service 中创建以下文件

[Unit]
Description=My progname service file

[Service]
ExecStart=/home/bits/MyProgram

[Install]
WantedBy=multi-user.target

之后运行systemctl daemon-reloadsystemctl start myprogname.service

如果你想自动重新启动 MyProgname 你必须添加

Restart=restart-always

到服务部分。

答案3

您需要运行telinit q来告诉 init 重新加载/etc/inittab,它不会自动执行此操作。我认为自从您Re-reading inittab在系统日志中提到该消息(您确实看到了此消息,对吧?)以来,您已经这样做了。

问题是您的进程根本没有启动,还是您的程序在启动过程中失败了?编写一个包装脚本,将错误重定向到日志文件:

#!/bin/sh
exec >/var/log/myprogram.log 2>&1 
exec /home/bits/MyProgram/start.myprogram

检查日志文件是否已创建,并查看其中是否出现任何错误。

我想到的一件事是您的程序可能需要在会话中设置环境变量。该init过程的环境非常有限。如有必要,修改包装器脚本以设置所有需要的变量。

答案4

init读取一个命令执行时inittab,它会 fork 一个 shell 并发送命令exec作为该 shell 中命令的参数。因此,检查一下如果您手动执行会发生什么:

sh -c exec /home/bits/MyProgram/start.myprogram

我会尝试的另一件事是完全绕过启动器脚本,在 inittab 中使用类似以下内容:

bes:2345:respawn:/usr/bin/mono /home/bits/MyProgram/EmailServer.exe "$@"

相关内容