sh bash スクリプトは、一重引用符を使用してファイルの PID をあいまいにリダイレクトします

sh bash スクリプトは、一重引用符を使用してファイルの PID をあいまいにリダイレクトします

.shファイルに次の新しい行があります

su --session-command='$javaCommandLine & >>$serviceLogFile 2>&1 & echo \$! >$pidFile' $serviceUser || return 1

二重引用符を使用したときは、ある程度は機能しましたが、pidFile の pid が間違っており、1 つずれていました。調査した解決策は、一重引用符を使用することでしたが、一重引用符では機能しません。

2つのエラーが発生しています

bash: $pidFile: あいまいなリダイレクト
bash: $serviceLogFile: あいまいなリダイレクト

一重引用符で囲んだ変数を使用したり、変数に出力したりすることはできないようです。

この行はほぼ動作しますが、pid が 1 つずれています。
以下のコードは起動時から開始されますが、pid が間違っています。

su --session-command="$javaCommandLine & >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1

このバグのある古い 2 行のコードを置き換える必要がありました。

cmd="nohup $javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile"
# Don't forget to add -H so the HOME environment variable will be set correctly.
sudo -u $serviceUser -H $SHELL -c "$cmd" || return 1

古いコードは正常に動作しましたが、起動時から起動できませんでした。

答え1

&の後に余分な を入れたため、プロセス ID が 1 つずれています$javaCommandLine。つまり、 を呼び出す前に 2 つのプロセスをバックグラウンドに置いたため、ではなくecho $!の PID が取得されます。古い 2 行のコードが示すように、これら 2 つの部分は 1 つにまとめる必要があります。>>$serviceLogFile 2>&1$javaCommandLine

 su --session-command="$javaCommandLine & >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1

次のように変更する必要があるかもしれません -

 su --session-command="$javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1

関連情報