Ubuntu Server10.04で実行されているApache2とpostgresを使用しています。
これらのアプリの両方の起動スクリプトを削除し、スーパーバイザーを使用してそれらを監視および制御しています。私が遭遇した問題は、これらの両方がpidファイル用に/ var/run内のディレクトリ(実行するユーザーの正しい権限を持つ)を必要とすることです。ルートとして作成してから正しいユーザーにchownする必要があるため、起動時にこれらを作成するにはどうすればよいですか?
編集
これを行うには、カスタムinitスクリプトを使用してディレクトリを作成するのが最善の方法のようです。シェルスクリプトのスキルがまったくないので、どうすればよいですか?
このコメントへの返信:
現在、サービスの起動スクリプトはありません。スーパーバイザデーモンはinit.dスクリプトによって開始され、他のサービスはこのサービスによって開始されます。このサービスはrootとして実行しないでください。
スーパーバイザーがinit.d
スクリプトから開始される場合は、スーパーバイザーが開始する前に実行する設定を使用して、別のinit.d
スクリプトを作成するだけです(これを実現する方法は、** IXのフレーバーに完全に依存します)。
そのstart
メソッドで、必要な権限を持つ必要なディレクトリを作成します。
stop
メソッドで、これらのディレクトリを破壊します。
Debianポリシー によると、
/var/run
および/var/lock
は一時ファイルシステムとしてマウントされる可能性があるため、init.d
スクリプトはこれを正しく処理する必要があります。これは通常、init.d
スクリプトの実行時に、必要なサブディレクトリをパッケージに含めてdpkgに依存して作成するのではなく、動的に作成することになります。
明らかに、UbuntuはDebianを継承しており、私が知る限り、このポリシーは変更されていません。
最善の解決策は、サービスの起動時にこれらのディレクトリが存在しない場合に作成されるように、新しい起動スクリプトを変更することです。
この種のものは "/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
最後に、スーパーバイザープロセスの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
いくつかのオプションがあります。
これに関するリフである他のオプションも機能させることができます。