回答:
foo
ファイルを作成またはファイルに書き込もうとするプログラムがある場合、foo
バイナリのアクセス許可は重要ではありませんが、実行しているユーザーがすべての違いを生みます。
この場合は、foo
への書き込みしようとしている/var/run
が所有している、root
とだけが書き込めルート。
そのsudo foo
ため、PIDファイルを作成するには、プログラムを実行する必要があります。実行する前にプログラムをrootとして実行できるようにすることのセキュリティへの影響を考慮してください...
/var/run
一般的なアプローチ:ファイルにアクセスしようとしているプロセスのユーザーとグループを特定します。これは多くの場合、ソフトウェアの構成(webservers / mailservers / ...など)にありますが、ソフトウェアが既に実行されている場合はこれを使用します。
ps aux
アクセス権を設定するプロセスを探します。最初の列は、実行中のユーザー名を示しています。
groups <username>
これにより、ユーザーが属するグループがわかります。
サービスに一致するようにファイルの所有者またはグループを変更します。
注1:ファイルが/ var / run /にあることを質問が指摘しているので、アクセスが必要なプロセスは1つだけであると想定しています。そうでない場合は、所有者またはグループを変更しないでください。 'ユーザーをグループに追加するか、このファイル/フォルダーの新しいグループを作成します。
注2:セキュリティシステムであるapparmorを使用すると、面白いことが起こる可能性があります。これにより、プロセスが(ファイルシステムレベルで)必要なすべての権限を持つファイルやフォルダーに書き込むことができなくなります。ではaa-status
、あなたはあなたのサービスのための特定のルールがアクティブであるかどうかを確認することができます。
私がやったのは、start-stop-deamonが実行される直前にフォルダーの作成を追加するだけです。これは、スクリプトが一般に起動時にルートとして実行されるために機能します。/ var / runにフォルダーを作成し、すぐに所有者を変更するだけなので、PIDを書き込むことができます。
以下の例では、/ var / runのサブフォルダーの存在を確認します。ここでは、現在の実行ユーザーとしてPIDを配置します。この場合、ユーザー 'pi'です(私はラズベリーを使用しているため)。
私にとって非常に教育的だったので、このリンクもチェックしてください:Pythonスクリプトをサービスとして実行しますが、ここで説明した問題はカバーしませんでした。
私のシェルスクリプトの一部の例:
# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/power/$DAEMON_NAME.pid
do_start () {
log_daemon_msg "Starting system $DAEMON_NAME daemon"
if [ ! -d /var/run/power ]; then
mkdir /var/run/power/
chown pi:pi /var/run/power/
fi
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chdir $DIR --startas $DAEMON -- $DAEMON_OPTS
log_end_msg $?
}