起動時に/etc/init.dのスクリプトを起動するにはどうすればよいですか?

起動時に/etc/init.dのスクリプトを起動するにはどうすればよいですか?

しばらく前にこれに関する内容を読んだようですが、どうなったのか覚えていません。デフォルトでは、/etc/init.d起動時に自動的に起動したいサービスがあります。スクリプトをディレクトリにシンボリックリンクすることに関連していたと思います/etc/rc.dが、今は覚えていません。このコマンドは何ですか?

私はFedora / CentOS派生製品を使用していると思います。

答え1

前述のようにRed Hatベースのシステムを使用している場合は、次のことができます。

  1. スクリプトを生成してここに入れます/etc/init.d(例/etc/init.d/myscript:)。スクリプトの形式は次のとおりです。
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

フォーマットは非常に標準的なので、で使用できます。その後、次/etc/init.dのスクリプトを使用できます。マニュアルページでは、スクリプトのタイトルについて説明します。/etc/init.d/myscript startchkconfig myscript startckconfig

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

次に定義するヘルパー関数の開始、停止、およびステータスコードの使用例/etc/init.d/functions

  1. スクリプトの有効化

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. スクリプトが実際に有効になっていることを確認してください。 「on」を選択したレベルが表示されます。

    $ chkconfig --list | grep myscript
    

答え2

マシンが通常起動するランレベルをテストします。

runlevel

通常、これは5または2です。さまざまなルールがありますが、私が知っている限り、実際には明確なものはありません。 Ubuntuは2を使用していますが、以前のディストリビューションは常に使用していました。

  • シングルユーザー(スーパーユーザー)1人
  • 2人のマルチユーザー
  • 3.マルチユーザー+ネットワーク
  • 4未使用/ユーザー定義可能
  • マルチユーザー5人、ネットワーク+X11

次に、初期化スクリプトでシンボリックリンクを作成します/etc/init.d/foobar/etc/rc2.d/SXYfoobar

Sは、「この実行レベル(ここでは2)でこのスクリプトを起動します」を意味します。 XY は、スクリプトの開始順序に関連する 2 桁の 10 進数です。

以前に実行されているS45barfooスクリプトに依存し、S55foofooがスクリプトに依存している場合は、45から55のxyを選択できます。同じ番号の場合、起動順序は定義されません。

同時にUbuntuはupstart

注:常に接続されているわけではありません/etc/rcX.d。時には接続または類似しています/etc/init/rcX.dが、/ etc の下のどこかで簡単に見つけることができるはずです。

起動スクリプトの最後に何かを起動するには、ファイルを探す必要がありますが、すでに/etc/rc.local実行されているX11に依存している場合は、デスクトップ環境の自動起動オプションを見つけるか、/etc/X11/Xsession.d/次のようなパターンを使用できます。上記のものの一つです。

正しく機能するためにネットワークに依存している場合は、マウントされたデバイス(外部USBドライブなど)用の別のディレクトリ(if-up.d)があります/etc/udev/rules.d/

答え3

/etc/fstabこの回答では、Ubuntuシステムのサービススクリプトを介して定義されたWindows共有(CIFS)をマウントしているとします。まず、mount -a -t cifs以下の/etc/init.d/mountcifs内容でアイテムを作成します。

#! /bin/sh
### BEGIN INIT INFO
# Provides:          mountcifs
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Mounts / Umounts Window Shares (CIFS)
# Description: Mounts / Umounts Window Shares (CIFS)
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

case "$1" in
  start)
        mount -a -t cifs
        ;;
  stop)
        umount -a -t cifs
        ;;
  restart|reload|force-reload)
        umount -a -t cifs
        mount -a -t cifs
        ;;
  *)
        # echo "Usage: $0 start|stop" >&2
        # exit 3
        ;;
esac

/etc/init.d/mountcifs利用可能であることを確認してくださいchmod 755 /etc/init.d/mountcifs

# Default-Start: 2 3 4 5コメントに参考にしてください。この説明のおかげで、次のコマンドを使用してUbuntuにフォルダにシンボリックリンクを作成するように指示/etc/rc2.dでき/etc/rc3.dます/etc/rc4.d/etcrc5.d

sudo update-rc.d mountcifs defaults

その後、次のようにスクリプトをテストできます。

sudo service start mountcifs
df -h # should see Windows Shares
sudo service stop mountcifs
df -h # all Windows Shares should be gone
sudo service start mountcifs
df -h # all Windows Shares should be back

Windows共有は、再起動時に自動的にマウントする必要があります。

答え4

Naftuli Tzvi Kayが上記でDebianについて尋ねたように:Debian 6以降、スクリプトには依存関係と機能を表すLinux Standard Library(LSB)ヘッダーを含める必要があります(Debian Wiki ページをご覧ください)。

LSBヘッダーがある場合は、次のようにinsservブートプロセスにスクリプトを含めることができます。他のDebian Wikiページを見る)。

関連情報