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에서 실행되도록 예약됩니다. .nohup
nohup
nohup
이 명령 세트에 을 어떻게 추가할 수 있나요 ?
답변1
몇 가지 옵션이 있으며, 모두 마지막에 포그라운드 세션을 종료해야 하는 요구 사항을 유지합니다( 사용 가능 kill $WB
).
- 가능하다면 tmux(또는 screen)를 사용하세요. 이것은 사용 사례에 대한 가장 확실한 솔루션입니다. 연결을 끊으면 tmux 세션이 분리되므로 나중에 출력을 검사하려는 경우(대신
tail -f nohup.out
) 실행하는 명령이 중지되지 않습니다. 세션에 다시 연결합니다. 모든 명령이 포그라운드에서 실행되기 때문에 이 트릭이 필요하지 않으므로kill $WB
간단한 명령이면exit
충분합니다.일반화하다: VPS에 ssh -> 실행tmux
-> 나열된 명령을 입력합니다(끝 부분에 명령을 입력하지 않고WB=$$; (
간단한 명령으로 바꿉니다) -> 필요에 따라 연결을 끊고 분리하고 다시 연결합니다.) &
kill $WB
exit
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 $$ &
파일에 넣을 수 없거나 넣기를 원하지 않으면 다음과 같이 실행하십시오
nohup bash -c " ...your commands here... ; kill $$" &
. 이는 bash 인수로 실행되기 전에 대체되므로$$
여전히 외부 전면 셸을 참조합니다 .-c
스크립트가 2시간 수면으로 시작되므로 해당 절차를 고려해 볼 수 있습니다
at
.at now + 2 hours
명령을 실행한 다음 2시간 후에 실행되도록 입력 할 수 있습니다 (1분 단위). 필요한 모든 명령을 입력한 후 Ctrl+D를 사용하여 "at shell"을 종료하고atq
명령 시퀀스가 실행되도록 예약되어 있는지 확인할 수 있습니다.스크립트를 구분된 문서로 실행할 수도 있습니다. 기본적으로 옵션 3과 동일하지만 명령을 인수로 지정하는 대신
-c
bash의 표준 입력에 공급합니다. 스크립트에 매개변수가 필요한 경우 다음과 같이 bash를 호출하는 동안 매개변수를 지정해야 합니다.nohup bash -s -- firstArgument secondArgument <<'EOF' & ....paste your code here..... EOF