скрипт sh bash неоднозначное перенаправление pid файла с использованием одинарных кавычек

скрипт sh bash неоднозначное перенаправление pid файла с использованием одинарных кавычек

У меня в файле .sh есть следующая новая строка:

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

Когда у меня было это с двойными кавычками, это как-то работало, но у pidFile был неправильный pid, он был на единицу меньше. Решение из исследования состояло в том, чтобы использовать одинарные кавычки, но я не могу заставить одинарные кавычки работать.

Теперь я получаю 2 ошибки.

bash: $pidFile: неоднозначное перенаправление
bash: $serviceLogFile: неоднозначное перенаправление

Кажется, я не могу использовать переменные или выводить данные в переменные в одинарных кавычках?

Эта строка почти работает, но pid отличается на единицу.
Этот код ниже запустится при загрузке, но 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

Идентификатор процесса смещен на единицу, потому что вы добавили дополнительный &после $javaCommandLine. Другими словами, вы поместили два процесса в фон перед вызовом echo $!, таким образом получив PID >>$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

Связанный контент