/etc/init.d/にスクリプトを作成しました。このスクリプトは、他の(ルート以外の特権を持つ)ユーザーからホームディレクトリから他のスクリプトをいくつか実行する必要があります。
これらのスクリプトを次のもので起動します。 sudo -b -u <username> <script_of_a_particular_user>
そしてそれは動作します。ただし、実行を継続するすべてのユーザースクリプト(ウォッチドッグなど)には、対応する親sudoプロセスが表示されますが、まだ生きており、rootとして実行されています。これにより、アクティブプロセスリストに混乱が生じます。
したがって、私の質問は次のとおりです。既存のbashスクリプトから別のユーザーとして別のスクリプトを起動(フォーク)して、孤立した(スタンドアロン)プロセスのままにするにはどうすればよいですか。
より詳細な説明:
私は基本的に、マシン上の他のユーザーに、.startUpと.shutDownという名前のホームディレクトリにあるそれぞれのサブディレクトリにある実行可能ファイルを実行することにより、システム起動またはシステムシャットダウン時に実行する手段を提供しようとしています。他の手段を見つけられなかったので、正確にそれを行うbashスクリプトを作成し、(スケルトンの例に従って)/etc/init.d/でサービススクリプトとして構成しました。 start引数を使用すると、.startUpディレクトリからすべてを起動し、stop引数を指定して実行すると、すべてのユーザーの.shutDownディレクトリからすべてを起動します。
あるいは、この問題を解決するために既存のソリューションを使用できたのかどうかにも興味があります。
更新
私は少し見て回ったところ、この質問を見つけました:https :
//unix.stackexchange.com/questions/22478/detach-a-daemon-using-sudo
そこに受け入れられた答え、使用する:sudo -u user sh -c "daemon & disown %1"
、私のために働く。しかし、私は%1を否認せずに試しましたが、それは同じです。だからこれは私が期待したように私のために働くものです:
sudo -u <username> bash -c "<script_of_a_particular_user> &"
私の追加の質問は、なぜそれが否認せずに機能するのかということです。とにかく、何らかの潜在的な特別なケースのために、私はまだdisownコールを離れるべきですか?
更新2
どうやらこれも動作します:
su <username> -c "<script_of_a_particular_user> &"
この呼び出しとsudo呼び出しに違いはありますか?これは潜在的にまったく異なる質問であることを知っています。しかし、私はこのトピックのために自分で答えをここで見つけているので、誰かがこれをここで明確にすることができます。
更新3
suまたはsudoを使用したこれらのメソッドはどちらも、マシンの起動後に新しいstartparプロセス(rootとして実行される単一プロセス)を生成します。プロセスリストに次のように表示されます。
startpar -f -- <name_of_my_init.d_script>
なぜこのプロセスが生まれたのですか?他のinit.dスクリプトではこのプロセスが実行されていないため、明らかに私は何か間違ったことをしています。
更新4
startparの問題は解決されました。そのための別の質問を始めました
。rc.localまたはinit.dからプロセスを開始すると、startparプロセスがハングしたままになります。
また、非特権ユーザー向けの起動メカニズムについてさらに議論する別の質問:
通常のユーザー(非ルート)に初期化およびシャットダウン自動実行機能を提供する