我正在使用 Ubuntu 12.04 并希望在系统正常启动时启动服务。
作为“服务”,我理解一些代码,例如 cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x 应该像在命令行上启动一样运行。有以普通用户启动的服务,也有以 root 启动的服务(实际上并不要求服务在用户级别运行)。
我还需要配置“服务”停止时的行为。我希望它们在我的情况下以相同的参数在指定目录中重新启动。
当系统正常启动时,即按下电源开关时,所有服务都应自动启动。不需要其他操作。
互联网上流传着一些文件,但它们都让我感到困惑。他们谈论init, init.d, rc.d, 但我从来没有看到一个简单易懂的分步说明,可以使用例如 upstart 轻松地作为服务。如果这很容易,如果在此处提供这些步骤,我将不胜感激。
Ale*_*lex 35
要创建在 Ubuntu 启动时自动启动的作业,请使用此处给出的示例。作为书面示例,假设/etc/init/testservice.conf使用 sudo创建以下文件:
# testservice - test service job file
description "my service description"
author "Me <myself@i.com>"
# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas
# When to start the service
start on runlevel [2345]
# When to stop the service
stop on runlevel [016]
# Automatically restart process if crashed
respawn
# Essentially lets upstart know the process will detach itself to the background
# This option does not seem to be of great importance, so it does not need to be set.
#expect fork
# Specify working directory
chdir /home/user/testcode
# Specify the process/command to start, e.g.
exec python mycommand.py arg1 arg2
Run Code Online (Sandbox Code Playgroud)
“手动”启动或停止进程使用
sudo start testservice
sudo stop testservice
Run Code Online (Sandbox Code Playgroud)
请参阅作业控制命令。
Bor*_*kov 23
好的,Alex,重点是Linux中的所有用户空间进程都是以init进程启动的,其pid为1。例如,运行pstree以查看进程树,其根为init..现在有几个版本的init进程实现,最值得注意的是
传统上,Unix 使用称为sysVinitinit 的init 实现,名称为https://ru.wikipedia.org/wiki/UNIX_System_V版本的 Unix。它非常有影响力,并且其他 init 向后兼容它。
基本上,sysVinit 首先读取/etc/inittab文件,决定运行哪个运行级别并告诉/etc/init.d/rc脚本执行所谓的 init 脚本。例如,当它正常启动到多用户运行级别(在 Ubuntu 上通常是运行级别 2)时,/etc/init.d/rc开始执行/etc/rc2.d. 文件只有指向脚本的符号链接,而脚本本身存储在/etc/init.d目录中。/etc/rc*.d目录中这些符号链接的命名如下。说,我们有以下脚本/etc/rc2.d:
$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager
Run Code Online (Sandbox Code Playgroud)
这意味着,在切换到运行级别 2 时,init 进程首先杀死network-manager进程,导致其脚本名称以K-K02network-manager开头,然后启动名称以S. Sor后面的两位数K是从 00 到 99 的数字,它决定了进程的启动顺序。例如rsyslog在之前启动apache2,因为 16 小于 17(这是有道理的,因为你希望 apache 依赖 rsyslog 的日志记录能力,因此应首先启动 rsyslog)。这些脚本是临时的 shell 脚本,由#!/bin/sh.
因此,基本上要在 sysVinit 风格的启动时启动程序,编写您自己的脚本(从任何示例中复制粘贴它,您已经进入/etc/init.d),将其放入并以/etc/init.d合理的名称创建一个符号链接,例如
S99mytrojan在/etc/rc2.d. 以下是 /etc/init.d 中典型 sysVinit 脚本的解释http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html
现在,Ubuntu 人员决定他们需要 init 的附加功能。他们想要一个快速启动的操作系统,所以他们希望他们的脚本并行执行;他们希望自动重启死进程;他们希望进程通过事件以显式方式相互调用(因此 apache 由“系统日志启动”事件运行,系统日志由“文件系统安装”事件等运行,因此我们有事件而不是一些数字 00 -99)。因此,他们制作了 Upstart,这是它的工作原理。新贵 initscripts 放在/etc/init目录中(不要与 混淆/etc/init.d)。Upstart 通常/etc/init.d/rc也会运行,所以它会正常执行你的 sysVinit 脚本。但是,如果您希望脚本在退出时重新生成 - Upstart 事件适合您。
虽然我无法检查我的脚本是否正常工作,但我想,为了您的目标,您应该编写以下/etc/init/mytrojan.conf脚本:
start on runlevel [02]
respawn
exec mytrojan --argument X
Run Code Online (Sandbox Code Playgroud)
但是,如果您需要依赖项,至少是文件系统和网络,那么替换start on runlevel [02]为以下内容可能是有意义的:
start on (local-filesystems and net-device-up IFACE!=lo)
Run Code Online (Sandbox Code Playgroud)
警告:我没有检查这个的正确性,因为我不能。特别是,我不太确定如何在网络连接启动并运行后启动脚本(我使用了这个版本)。尝试在谷歌上搜索“网络上的新贵”。
| 归档时间: |
|
| 查看次数: |
89316 次 |
| 最近记录: |