「su -c」で起動したコマンドからプロセスIDを取得する


9

シェル内でJavaプログラムを実行し、プロセスIDをテキストファイルに書き込んでいます。だから私がこれをするとき:

nohup java app.Main > /dev/null 2>&1 &
echo $! > /var/run/app.pid

できます。しかし、本当に別のユーザーとして実行したい

su - appuser -c "nohup java app.Main > /dev/null 2>&1 &"
echo $! > /var/run/app.pid

これは機能しません。-cオプションで起動されたコマンドのプロセスIDを取得する方法はありますか?

回答:


8

できるよ:

su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
                 echo "$!"' > /var/run/app.pid

(これは、ログインシェルappuserがBourneに似ていると想定しています)。

su -環境をリセットするため、コマンドラインで変数を展開する場合は、次のようにシェル(リモートユーザーのログインシェルではない)で展開する必要があります。

su - appuser -c "nohup '$JAVA_BIN' '$JAVA_CLASS' > /dev/null 2>&1 &"'
                 echo "$!"' > /var/run/app.pid

(これらの変数に一重引用符が含まれていないことを前提としています)。

リダイレクトは、シェルではなく(シェルとして実行されているroot)シェルによって実行されるようにする必要があります(appuserシェルにはおそらく書き込み権限がないため/var/run)。


2
ありがとうございました。うまくいきましたが、私の場合は少し調整する必要がありました。何らかの理由で、$の前にバックスラッシュを追加する必要がありました。そして、権限の問題のため、それをtmpファイルにパイプする必要がありました。次の行は、それをtmpファイルから読み取り、適切な場所に配置します。 su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"
Prasanth 2014

@Prasanth、私の編集を参照してください。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.