サービスはデフォルトで、RHELボックスでの起動時にroot
として開始します。正しく思い出せば、/etc/init.d
のinitスクリプトを使用する他のLinuxディストリビューションでも同じことが言えます。
代わりに、プロセスを選択した(静的な)ユーザーとして実行する最良の方法は何だと思いますか?
私が着いた唯一の方法は、次のようなものを使用することでした:
su my_user -c 'daemon my_cmd &>/dev/null &'
しかし、これは少しだらしないようです...
他の非rootユーザーとして自動的にサービスを開始する簡単なメカニズムを提供する魔法が少し隠れていますか?
EDIT:このインスタンスで開始するプロセスは、PythonスクリプトまたはJavaプログラム。私はむしろそれらの周りにネイティブラッパーを書きたくないので、残念ながら Black が示唆するように setuid() を呼び出すことができません。
Debianでは、start-stop-daemon
ユーティリティを使用します。このユーティリティは、pidファイルを処理し、ユーザーを変更し、デーモンをバックグラウンドに入れます。
私はRedHatに精通していませんが、すでに使用しているdaemon
ユーティリティ(/etc/init.d/functions
、btwで定義されています)は、start-stop-daemon
と同等のものとしてどこでも言及されているため、プログラムのuidを変更することもできます。あなたのやり方はすでに正しいものです。
ネットを見ると、使用できる既製のラッパーがいくつかあります。すでにRedHatにパッケージ化されているものもあります。 daemonize
などをご覧ください。
ここですべての提案を確認した後、私は自分の立場にある他の人に役立つと思ういくつかのことを発見しました:
hop は/etc/init.d/functions
を指すのに正しい:daemon
関数は既に代替ユーザーを設定することを許可している:
daemon --user=my_user my_cmd &>/dev/null &
これは、プロセス呼び出しをrunuser
でラップすることで実装されます-これについては後で詳しく説明します。
Jonathan Leffler は正しい:Pythonにはsetuidがあります:
import os
os.setuid(501) # UID of my_user is 501
ただし、JVM内からsetuidできるとはまだ思いません。
su
とrunuser
のどちらも、既存のユーザーとしてコマンドを実行するように要求するケースを適切に処理しません。例えば。:
[my_user@my_Host]$ id
uid=500(my_user) gid=500(my_user) groups=500(my_user)
[my_user@my_Host]$ su my_user -c "id"
Password: # don't want to be prompted!
uid=500(my_user) gid=500(my_user) groups=500(my_user)
su
とrunuser
の動作を回避するために、initスクリプトを次のようなものに変更しました。
if [[ "$USER" == "my_user" ]]
then
daemon my_cmd &>/dev/null &
else
daemon --user=my_user my_cmd &>/dev/null &
fi
ご協力ありがとうございます!
独自のデーモンを作成する場合は、setuid()を呼び出すことをお勧めします。このようにして、あなたのプロセスは
他に注意することを追加するだけです:
svnサーバー用のCENTOS(Red Hat)仮想マシン:/etc/init.d/svnserver
を編集して、pidをsvnが書き込み可能なものに変更します。
pidfile=${PIDFILE-/home/svn/run/svnserve.pid}
オプション--user=svn
を追加しました:
daemon --pidfile=${pidfile} --user=svn $exec $args
元のpidfileは/var/run/svnserve.pid
でした。デーモンは、becaseuを起動せず、rootのみがそこに書き込むことができました。
These all work:
/etc/init.d/svnserve start
/etc/init.d/svnserve stop
/etc/init.d/svnserve restart
注意するべきいくつかの事柄:
通常、デーモンを起動する前に/ sbin/suを使用して適切なユーザーに切り替えます。
Initスクリプトで次のことを試してみてください。
setuid $USER application_name
それは私のために働いた。
Spring .jarアプリケーションをサービスとして実行する必要があり、これを特定のユーザーとして実行する簡単な方法を見つけました。
Jarファイルの所有者とグループを、実行したいユーザーに変更しました。次に、init.dでこのjarをシンボリックリンクし、サービスを開始しました。
そう:
#chown myuser:myuser /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar
#ln -s /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar /etc/init.d/springApp
#service springApp start
#ps aux | grep Java
myuser 9970 5.0 9.9 4071348 386132 ? Sl 09:38 0:21 /bin/Java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /var/lib/jenkins/workspace/springApp/target/springApp-1.0.jar