web-dev-qa-db-ja.com

起動時に/ var / run /にディレクトリを作成します

Ubuntu Server10.04で実行されているApache2とpostgresを使用しています。
これらのアプリの両方の起動スクリプトを削除し、スーパーバイザーを使用してそれらを監視および制御しています。私が遭遇した問題は、これらの両方がpidファイル用に/ var/run内のディレクトリ(実行するユーザーの正しい権限を持つ)を必要とすることです。ルートとして作成してから正しいユーザーにchownする必要があるため、起動時にこれらを作成するにはどうすればよいですか?

編集
これを行うには、カスタムinitスクリプトを使用してディレクトリを作成するのが最善の方法のようです。シェルスクリプトのスキルがまったくないので、どうすればよいですか?

5
Frozenskys

このコメントへの返信:

現在、サービスの起動スクリプトはありません。スーパーバイザデーモンはinit.dスクリプトによって開始され、他のサービスはこのサービスによって開始されます。このサービスはrootとして実行しないでください。

スーパーバイザーがinit.dスクリプトから開始される場合は、スーパーバイザーが開始する前に実行する設定を使用して、別のinit.dスクリプトを作成するだけです(これを実現する方法は、** IXのフレーバーに完全に依存します)。

そのstartメソッドで、必要な権限を持つ必要なディレクトリを作成します。

stopメソッドで、これらのディレクトリを破壊します。

Debianポリシー によると、

/var/runおよび/var/lockは一時ファイルシステムとしてマウントされる可能性があるため、init.dスクリプトはこれを正しく処理する必要があります。これは通常、init.dスクリプトの実行時に、必要なサブディレクトリをパッケージに含めてdpkgに依存して作成するのではなく、動的に作成することになります。

明らかに、UbuntuはDebianを継承しており、私が知る限り、このポリシーは変更されていません。

最善の解決策は、サービスの起動時にこれらのディレクトリが存在しない場合に作成されるように、新しい起動スクリプトを変更することです。

6
ephemient

この種のものは "/etc/rc.local"に置くべきです。例:

#!/bin/sh -e
# 
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

if [ ! -d /var/run/foo ]; then
  mkdir /var/run/foo/
  chown user1:group1 /var/run/foo/
fi
if [ ! -d /var/run/bar ]; then
  mkdir /var/run/bar/
  chown user2:group2 /var/run/bar/
fi
exit 0
4
G.Helland

最後に、スーパーバイザープロセスのinit.dスクリプトでこのコードを使用しました。

while IFS=: read file user group
    do
        if [ -d $file ]; then
            chmod 2775 $file
        else
            install -d -m 2775 -o $user -g $group $file
        fi
    done < "/etc/run_dirs.txt"

これは、次の形式の行を含むファイルを読み取り、適切なディレクトリと権限を作成します。

path/to/dir:user:group

1
Frozenskys

いくつかのオプションがあります。

  1. インストール時にディレクトリを作成する
  2. 起動時に作成されるすべてのディレクトリのファイルを作成し、それらすべてのファイルを作成して起動時に実行するプログラムを作成します(ルート権限を持つ起動スクリプトから)。

これに関するリフである他のオプションも機能させることができます。

0
Walter