
プロセスを開始および停止する簡単な init.d スクリプトがあります。 init.d を root として呼び出しますが、それが制御するプロセスを特定のユーザーとして実行したいと思います。
オンラインで最も一般的な提案は、
su myuser -c "my_process args"
ただし、これにより 2 番目のプロセス スペース、新しいシェルなどが作成され、やや洗練されません。
シェルを置き換えるので を使いたいのですexec()
が、これはユーザーを引数として取りません。これはsetuid()
最初に を使うべきケースでしょうか? gid の設定はどうでしょうか? 何か注意すべき点はありますか?
あるいは、別のユーザーとして init.d を実行するためのディストリビューション固有のソリューションはありますか? 私の環境は Centos 6.4 です。
答え1
/etc/rc.d/init.d/functions
ディストリビューションによって異なりますが、RHEL ベースのディストリビューションは、呼び出されるBash 関数を使用しますが、daemon
それ自体はコマンドのラッパーにすぎませんrunuser
。ソース ファイルから判断すると、ほとんどの場合、機能的には同じですがsu
、PAM を経由しないだけです (おそらく、特定のケースで鶏が先か卵が先かという問題を回避するためです)。
これはあなたの反論に答えるものではないが、サービスがそれを実現する方法だ。あなたが望むような簡潔さと全体的な論理への適合は、次のようなことの動機の一部である。systemd
答え2
の使用はsu someuser -c ...
必要なことです。まず、 はsetuid()
シェル コードでは使用できないシステム コールです。必要以上に難しくしないでください。