sh bash 스크립트 작은 따옴표를 사용하는 파일의 모호한 리디렉션 ID

sh bash 스크립트 작은 따옴표를 사용하는 파일의 모호한 리디렉션 ID

내 .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. 즉, 을 호출하기 전에 백그라운드에 두 개의 프로세스를 배치하여 가 아닌 의 echo $!PID를 얻습니다 . 이전 2줄 코드에서 볼 수 있듯이 이 두 부분을 하나로 묶어야 합니다.>>$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

관련 정보