콘텐츠/opt/scripts/jvm/jvm.script.sh
#!/bin/bash
JAVA_HOME='/java'
PATH="$PATH:/$JAVA_HOME/bin"
java -cp ./classes:./lib com.mystuff.bar.foo.myclass &
콘텐츠/etc/init.d/init.script.sh
home='/opt/scripts/jvm'
program=jvm.script.sh
su scriptuser -c "$home/$program"
/opt/scripts/jvm
기호로 연결됨 /data/shellscripts
( /data/shellscripts
실제 디렉터리로 존재함을 의미)
init 스크립트 실행이 실패했지만 cannot find class com.mystuff.bar.foo.myclass
동일한 사용자에게 su하여 실행하면 작동합니다. 이유는 무엇입니까?
실행하면 을 su scriptuser -c 'declare -p JAVA_HOME'
얻지 JAVA_HOME not found
만 먼저 su scriptuser
사용자로 su(사용)하고 실행하면 다음을 얻습니다.JAVA_HOME="/java"
이상하게 들릴 수도 있지만 init 스크립트의 home 변수에 후행 슬래시를 추가하면 효과가 있는 것 같습니다.
그래서:
home='/opt/scripts/jvm'
~이 되다
home='/opt/scripts/jvm/'
환경적 요인이 심볼릭 링크 처리 방식을 혼란스럽게 만드는 것 같습니다.
답변1
이것은 경로와 su'ing에 대한 혼란스러운 질문입니다. 이 명령을 실행하면:
$java -cp ./classes:./lib com.mystuff.bar.foo.myclass
Java가 ./classes 또는 ./lib에서 클래스를 찾을 수 없음을 의미하는 "클래스를 찾을 수 없음"을 얻습니다. 만약 당신도
a) 절대 경로를 사용하거나 b) 명령을 실행하기 전에 올바른 위치로 cd합니다(su scriptuser -c "cd $home ; ./$program").
더 안정적으로 작동합니다.
home 뒤에 "/"를 추가하는 것이 왜 차이가 나는지에 대해서는 이상하게 보입니다. strace/truss를 분석하고 명령이 수행하는 시스템 호출을 확인할 수 있습니다. 이 답변은 POSIX 사양을 인용합니다.
Linux는 다중 경로 구분 기호(/home////username///file)를 어떻게 처리합니까?
그리고 "디렉토리 항목에서 작동하는 프로그램의 경우 foo가 디렉토리에 대한 심볼릭 링크인 경우 foo/를 전달하는 것은 프로그램이 심볼릭 링크 대신 디렉토리에서 작동하도록 만드는 방법입니다."라고 말합니다.