我目前正在开发一个项目,需要添加该项目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-reload
并systemctl 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 "$@"