Ubuntuの起動時にサービスを自動的に開始する方法は?


31

Ubuntu 12.04を使用していますが、システムが正常に起動したときにサービスを開始したいです。

「サービス」として、たとえばcd my_directoryなどのいくつかのコードを理解しています。my_command -host 0.0.0.0 -port 1234 -arg xこれは、コマンドラインで起動されたかのように実行されるだけです。通常のユーザーとして開始するサービスがありますが、rootとして開始するサービスもあります(実際、サービスをユーザーレベルで実行する必要はありません)。

また、「サービス」が停止したときの動作を構成する必要があります。私の場合、指定されたディレクトリで同じ引数を使用して再起動する必要があります。

システムが正常に起動すると、つまり、電源スイッチが押された場合、すべてのサービスが自動的に開始されます。他のアクションは必要ありません。

インターネット上にはいくつかのドキュメントが広がっていますが、それらはすべて私を混乱させます。彼らはについて話すinitinit.drc.d、私は例えば成り上がりを使用してサービスとして簡単に、簡単にフォローステップバイステップの指示を見たことがありません。これが簡単な場合は、これらの手順をここに示していただければ幸いです。

回答:


33

Ubuntuの起動時に自動的に開始されるジョブを作成するには、ここに記載されている例を使用します。書かれた例として、/etc/init/testservice.confsudo を使用して次のファイルを作成するとします。

# 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

プロセスを「手動で」開始または停止するには

sudo start testservice
sudo stop testservice

ジョブ制御コマンドを参照してください。


サービスを開始するには、「開始されたmountallで開始」が必要でした。
-martinedwards

23

[OK]を、アレックスは、ポイントは、Linuxのすべてのユーザ空間プロセスが使用を開始していることであるinitそのpidの1である。例えば、実行、プロセスpstreeルートのinitされ、あなたのプロセスのツリーを、参照するには...いくつかのバージョンがありinit、プロセスの実装では、最近、最も注目すべきは

  • sysVinit(古典的なinit、古いDebianを含むいくつかのディストリビューションでまだ使用されています)
  • 古いUbuntuと一部のRHEL(Red Hat)および古いFedoraバージョンで使用される初期化init
  • systemd init、最新のFedora、Ubuntu、Debian、RHEL、SUSEバージョンで使用

伝統的に、Unixはinitと呼ばれるinit実装を使用していました。これsysVinithttps://ru.wikipedia.org/wiki/UNIX_System_VバージョンのUnixの名前で呼び出されます。それは非常に影響力があり、他の初期化は後方互換性があります。

基本的に、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

つまり、ランレベル2のinitプロセスに切り替えるとnetwork-manager、最初にプロセスが強制終了され、そのスクリプト名がK- K02network-managerで始まり、その後、名前がで始まるプロセスが開始されSます。Sまたはの2桁Kは00から99までの数字で、プロセスを開始する順序を決定します。たとえば、16が17未満であるため、rsyslogapache2に開始されます(これは理にかなっています。 、したがって、rsyslogを最初に起動する必要があります。スクリプトは、によって実行されるカジュアルなシェルスクリプト#!/bin/shです。

そのため、基本的にsysVinitスタイルで起動時にプログラムを開始するには、独自のスクリプトを作成し(任意の例からコピーアンドペーストします/etc/init.d)、/etc/init.d適切な名前(例:)でシンボリックリンクを作成 S99mytrojan/etc/rc2.dます。/etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.htmlにある典型的なsysVinitスクリプトの説明を次に示します。

現在、Ubuntuのメンバーは、initから追加の機能が必要であると判断しました。高速ブートOSが必要だったため、スクリプトを並行して実行したかったのです。デッドプロセスを自動的に再起動したかったのです。彼らは、プロセスがイベントによって明示的な方法でお互いを呼び出すことを望んでいました(したがって、Apacheは「syslog開始」イベントによって実行され、syslogは「ファイルシステムマウント」イベントなどによって実行されるので、いくつかの数字の代わりにイベント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 

ただし、少なくともファイルシステムとネットワークの依存関係が必要な場合はstart on runlevel [02]、次のようなものに置き換えるのが理にかなっています。

start on (local-filesystems and net-device-up IFACE!=lo)

警告:私はこれができないので、これの正確さをチェックしませんでした。特に、ネットワーク接続が起動して実行された後にスクリプトを起動する方法についてはよくわかりません(このバージョンを使用しました)。「up up on network up」のグーグルを試してください。


1
これは、Linuxで開始されたプロセスの歴史に関する非常に素晴らしい概要ですが、質問ごとに答えているわけではありません。スタートアッププロセスを「作成」する方法はまだわかりません。私もそれを使用したいだけで、それがどのように機能するかについて少しも理解していない 私は、ubuntuのupstart..lで自動的に開始および再生成されるプロセスを作成する方法の、シンプルで使いやすい作業例が必要でした。
アレックス

@Alex:サンプルsciptで更新。私のスクリプトは非常に間違っているかもしれないことに注意してください。私はalexreisner.com/code/upstartの精神でそれをしました
ボリスブルコフ

1
これは私が今まで読んだ中で最高の答えの一つだからです。
user1301428 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.