sh Bash-Skript mehrdeutige Umleitung der PID einer Datei unter Verwendung einfacher Anführungszeichen

sh Bash-Skript mehrdeutige Umleitung der PID einer Datei unter Verwendung einfacher Anführungszeichen

Ich habe die folgende neue Zeile in meiner .sh-Datei

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

Als ich es mit doppelten Anführungszeichen hatte, funktionierte es einigermaßen, aber die PID-Datei hatte die falsche PID, sie war um eins verschoben. Die Lösung aus der Recherche bestand darin, einfache Anführungszeichen zu verwenden, und ich bekomme einfache Anführungszeichen nicht zum Laufen.

Ich bekomme jetzt 2 Fehler

bash: $pidFile: mehrdeutige Weiterleitung
bash: $serviceLogFile: mehrdeutige Weiterleitung

Scheint, als ob ich keine Variablen verwenden oder an Variablen in einfachen Anführungszeichen ausgeben kann?

Diese Zeile funktioniert fast, aber die PID weicht um eins ab.
Der folgende Code würde beim Hochfahren starten, aber die PID ist falsch.

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

das diesen fehlerhaften alten 2-Zeilen-Code ersetzen musste.

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

Der alte Code funktionierte einwandfrei, konnte aber beim Hochfahren nicht gestartet werden.

Antwort1

&Die Prozess-ID ist um eins verschoben, weil Sie nach dem ein zusätzliches eingefügt haben $javaCommandLine. Mit anderen Worten, Sie haben vor dem Aufruf von zwei Prozesse in den Hintergrund gestellt echo $!und erhalten so die PID von >>$serviceLogFile 2>&1statt $javaCommandLine. Diese beiden Teile sollten in einem zusammengefasst werden, wie der alte 2-zeilige Code zeigt

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

Möglicherweise müssen Sie es ändern in:

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

verwandte Informationen