본문 바로가기

CS study/Linux

[Linux] nohup shell script 실행 불가

목차

    [240123 백업]

     

    centos nohup 스크립트 실행 불가 문제가 발생했다.

    'nohup failed to run command 'java' no such file or directory' 문제. 즉, 자바를 읽지 못하는 문제이다.

    문제 상황

    1. /etc/progfile에 JAVA_HOME PATH 저장 후 root 계정과 chshin 계정 전부 적용됨을 확인한 상태이다.

    두 계정 전부 echo $JAVA_HOME이나, java -version 등을 통해 성공적으로 경로가 등록되었다.

     

    2. root 계정은 ./startup.sh 스크립트가 정상적으로 실행된다 (Scouter).

    하지만 chshin의 경우 'nohup: redirecting stderr to stdout nohup: failed to run command `java': 그런 파일이나 디렉터리가 없습니다 ' 라는 CLI 로그와 함께 실행이 불가능하다.

    1. chshin의 경우 실행 불가

     

    root 계정으로는 실행 가능

    #!/usr/bin/env bash
    
    
    nohup java -Xmx1024m -classpath ./scouter-server-boot.jar scouter.boot.Boot ./lib > nohup.out &
    sleep 1
    tail -100 nohup.out

     

     

    해결 방법

     

    1. PATH 경로 확인

     

    경로 설정은 크게 문제 없는 것 같다.

     

    2. java 권한 확인

     

    일반 사용자도 read 권한이 있는 걸 보니 딱히 문제 상황은 아닌 것 같다.

     

    3. 스크립트에 export PATH 추가(해결)

     

    #!/usr/bin/env bash
    
    
    export PATH=/opt/java/bin:$PATH
    #source ~/.bashrc 이건 아님
    
    nohup java -Xmx1024m -classpath ./scouter-server-boot.jar scouter.boot.Boot ./lib > nohup.out &
    sleep 1
    tail -100 nohup.out

     

    export 스크립트 추가를 통해 문제가 해결되었다.

    분명 echo PATH 등으로 확인했을때 떴는데 왜..?

     

    문제의 원인 : 비로그인셸

     

    SSH로 접속했으나, 로그인 되지 않은 셸이었다.

     

    문제의 원인을 확인했다. 'shopt login_shell' 이나, 'echo $0'을 통해 현재 로그인 상태를 확인할 수 있었다.

     

    reference : 

    https://goldsony.tistory.com/244

     

    [리눅스] 로그인 쉘(login shell)과 비로그인 쉘(non-login shell)

    #244 1. 로그인 쉘(login shell)과 비로그인 쉘(non-login shell) 1) 로그인 쉘(login shell) 시스템에 로그인을 통하여 접근하는 일반적인 쉘입니다. 2) 비로그인 쉘(non-login shell) 로그인 쉘로부터 파생되는 쉘

    goldsony.tistory.com

     

    로그인 셸 vs 비로그인 셸의 환경 변수 로딩 차이

     

    로그인 셸과 비로그인 셸은 환경 변수를 로드하는 방식이 다르다.

    로그인 셸은 /etc/profile과 사용자의 ~/.bash_profile, ~/.bash_login, ~/.profile 등을 차례로 읽어 환경 변수를 설정한다.

    반면, 비로그인 셸은 ~/.bashrc 파일을 읽어 환경 변수를 설정한다.

    /etc/profile에서 설정된 PATH는 로그인 셸에서만 적용되므로, 비로그인 셸에서는 이 설정이 반영되지 않았던 것이다.

     

    + 로그인 셸로 로그인 방법

    su 명령어를 사용하자. 

    현재 사용자로 다시 로그인하는 것처럼 su - [username] 명령어를 사용하여 새로운 로그인 셸 세션을 시작할 수 있다.