bash 명령 세트에 nohup을 어떻게 추가합니까?

bash 명령 세트에 nohup을 어떻게 추가합니까?

VPS에서 가끔 실행하는 다음 명령 세트가 있습니다. 기본적으로 잘 작동합니다. 백그라운드에서 실행되며 필요한 작업을 수행합니다.

WB=$$; (
       sleep 2h;
       echo "Removing PMA and exiting";
       phpdismod mcrypt mbstring;
       apt-get purge phpmyadmin -y;
       service apache2 restart;
       sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g' /etc/apache2/apache2.conf;
       kill $WB
) &

내가 그리워하는 유일한 점은 다음과 같습니다.

이 명령 세트에서 내가 놓친 유일한 것은 세션을 닫거나 전원이 꺼지는 경우에 nohup나에게 중요합니다. ---를 사용하면 이 경우 명령 세트가 VPS에서 실행되도록 예약됩니다. .nohupnohup

nohup이 명령 세트에 을 어떻게 추가할 수 있나요 ?

답변1

몇 가지 옵션이 있으며, 모두 마지막에 포그라운드 세션을 종료해야 하는 요구 사항을 유지합니다( 사용 가능 kill $WB).

  1. 가능하다면 tmux(또는 screen)를 사용하세요. 이것은 사용 사례에 대한 가장 확실한 솔루션입니다. 연결을 끊으면 tmux 세션이 분리되므로 나중에 출력을 검사하려는 경우(대신 tail -f nohup.out) 실행하는 명령이 중지되지 않습니다. 세션에 다시 연결합니다. 모든 명령이 포그라운드에서 실행되기 때문에 이 트릭이 필요하지 않으므로 kill $WB간단한 명령이면 exit충분합니다.일반화하다: VPS에 ssh -> 실행 tmux-> 나열된 명령을 입력합니다(끝 부분에 명령을 입력하지 않고 WB=$$; (간단한 명령으로 바꿉니다) -> 필요에 따라 연결을 끊고 분리하고 다시 연결합니다.) &kill $WBexit
  2. tmux를 사용할 수 없거나 사용하고 싶지 않다면 명령을 파일에 넣으세요. 여기서 문제는 기본적으로 nohup그룹화된 명령을 실행할 수 없다는 것입니다(하위 쉘의 개념은 bash에 고유하며 nohup으로는 수행할 수 없습니다). 따라서 코드를 파일에 넣을 수 있습니다 /opt/myscript.sh. 예를 들면 다음과 같습니다.

    #!/bin/bash
    
    #You will pass the PID of the foreground shell as its first argument
    WB=$1
    
    sleep 2h;
    echo "Removing PMA and exiting";
    phpdismod mcrypt mbstring;
    apt-get purge phpmyadmin -y;
    service apache2 restart;
    sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g' /etc/apache2  /apache2.conf;
    kill $WB
    

    그러면 실행하시면 됩니다nohup /opt/myscript.sh $$ &

  3. 파일에 넣을 수 없거나 넣기를 원하지 않으면 다음과 같이 실행하십시오 nohup bash -c " ...your commands here... ; kill $$" &. 이는 bash 인수로 실행되기 전에 대체되므로 $$여전히 외부 전면 셸을 참조합니다 .-c

  4. 스크립트가 2시간 수면으로 시작되므로 해당 절차를 고려해 볼 수 있습니다 at. at now + 2 hours명령을 실행한 다음 2시간 후에 실행되도록 입력 할 수 있습니다 (1분 단위). 필요한 모든 명령을 입력한 후 Ctrl+D를 사용하여 "at shell"을 종료하고 atq명령 시퀀스가 ​​실행되도록 예약되어 있는지 확인할 수 있습니다.

  5. 스크립트를 구분된 문서로 실행할 수도 있습니다. 기본적으로 옵션 3과 동일하지만 명령을 인수로 지정하는 대신 -cbash의 표준 입력에 공급합니다. 스크립트에 매개변수가 필요한 경우 다음과 같이 bash를 호출하는 동안 매개변수를 지정해야 합니다.

    nohup bash -s -- firstArgument secondArgument <<'EOF' &
    ....paste your code here.....
    EOF
    

관련 정보