web-dev-qa-db-ja.com

Bash init-特定のユーザーでサービスを開始する

特定のユーザーの下でサービスを開始するbash(Ubuntu)でinitスクリプトを作成しようとしています。

これ以外にもっと良い方法はありますか?

su - <user>  -c "bash -c  'cd $DIR ;<service name>'"
11
David Ryder

Ubuntuはstart-stop-daemonは既にこの機能をサポートしています。

/etc/init.dのスケルトンファイルを使用します。

Sudo cp /etc/init.d/skeleton /etc/init.d/mynewservice

Mynewserviceを適切に編集します。

Start-stop-daemonを呼び出す行に次のパラメーターを追加します。

--chuid username:group

例:

変化する

start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \

start-stop-daemon --start --quiet --chuid someuser:somegroup --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \

最後に、サービスを登録して開始します。

update-rc.d mynewservice defaults 99 && service mynewservice start

Start-stop-daemonの他のオプションの詳細 ここ

20
Carl

または、/etc/init.d/functionsファイルで定義されているdaemon関数を使用できます。

daemon --user=<user> $DIR/program

その構文を調べると、PIDファイルの場所の定義、Niceレベルの設定など、他のことを行うことができます。それ以外の場合は、デーモンとしてサービスを起動するのに非常に便利です。 daemonで開始されたサービスは、別の関数関数killprocで簡単に終了できます。

4
Manny D

/etc/init.d/下にyour_service_nameと言うスクリプトを最小限のコンテンツで作成できます。

#!/bin/sh
su - <user> -c "bash -c 'cd $DIR ;<service name>'"

スクリプトに適切な権限を与えます。次に、必要なupdate-rc.dディレクトリで/etc/rc<run_level>.dコマンドを使用してスクリプトのソフトリンクを作成し、システムが上記の実行レベルで起動したときにスクリプトが実行されるようにします。
参照用に/etc/init.d/のスクリプトを参照してください。スクリプトの記述の詳細については、/etc/init.d/READMEを参照してください。 update-rc.dのmanページもupdate-rc.dの使用法を知るのに役立ちます。これは間違いなく私が使用しているUbuntuマシンで機能しますが、この機能はディストリビューション全体で利用できるようになると思います。
お役に立てれば!

2

同じ問題があり、私はそれを解決しました

  1. Bashスクリプトを作成し、次のパターンを使用して/etc/init.d/に配置します
    #!/bin/bash
    su <user> -c "bash -c '<path to service> $1'"

  2. 次のコマンドを使用して、スクリプトのセットアップ実行コード
    Sudo update-rc.d <my_scrpit> defaults

このスクリプトが実行コードに設定されると、再起動時にrootがスクリプトを実行し、実行モードのステータスに応じて、スクリプトにstart/stopを$ 1として渡します。
再起動せずにスクリプトをテストする場合は、スクリプトをルートとして実行し、サービスアクションを渡します。開始/停止/再起動...
root# ./etc/init.d/my_scrpit start

1
Ali