Bash에서 시간 단위로 시간 초과하는 방법(세션이 닫혀도 시간 초과를 유지하는 방법)은 무엇입니까?

Bash에서 시간 단위로 시간 초과하는 방법(세션이 닫혀도 시간 초과를 유지하는 방법)은 무엇입니까?

Ubuntu 16.04에 PHPmyadmin을 설치한 다음 제거하기 위해 다음 스크립트를 만들었습니다...

내 목표는 PHPmyadmin을 사용할 때마다 이 스크립트를 사용하고 일정 시간이 지나면서 사용하는 것입니다.2시간, 삭제하세요. 이것설치-사용-제거이 방법은 보안상의 이유로 사용됩니다(MySQL에 최대한 액세스할 수 없도록 하고 짧은 시간 동안 로컬에서만 액세스 가능).

bash /dev/fd/15 15<< 'EOF0'    

#!/bin/bash -x

# Install commands:

sudo apt-get install phpmyadmin
sudo phpenmod mcrypt
sudo phpenmod mbstring
cat << EOF1 >> /etc/apache2/apache2.conf

Include /etc/phpmyadmin/apache.conf
EOF1
sudo service apache2 restart

# Unnstall commands:

sleep 2h    
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf

EOF0

Jeff가 주석에서 지적했듯이(그리고 코드 예제를 편집할 때) 명령을 사용할 수 있지만 sleep고전 sleep적인 형식에서는 세션이 열려 있어야 하고 어떤 이유로든 창이 때때로 닫힐 수 있습니다. a 정식 답변에서는 이 2시간 동안 일시 중지하는 방법을 보여줘야 합니다. 하지만 실수로/의도적으로 창을 닫거나 어떤 이유로든 컴퓨터가 다시 시작되거나 정전이 발생하더라도 --- 일시 중지하면 해당 명령 이후의 모든 작업은 내 측의 간섭 없이 VPS에서 계속 실행됩니다.

그렇다면 설치 명령을 실행한 지 2시간 후에 세션 독립적 방식으로 제거 명령을 어떻게 실행할 수 있습니까?

답변1

이를 달성하기 위해 이 유틸리티를 사용할 수 있습니다 at.

단일 명령의 경우 다음을 수행합니다.

at 'now + 2 hours' -f /path/to/uninstall.sh

여러 명령의 경우 다음을 통해 스크립트를 셸에 공급합니다.cat heredocument:

cat << EOF | at 'now + 2 hours'
command1
command2
........
EOF

또는 systemd솔루션을 통해 이를 달성할 수도 있습니다(설치한 경우에도 마찬가지).

systemd-run --on-active=2h -- /bin/bash /path/to/uninstall.sh

답변2

보시다시피 귀하는 sudo액세스 권한이 있고 서비스를 시작할 수 있습니다. 따라서 atd서비스와 at명령을 사용하여 작업을 예약할 수 있습니다.

echo 'touch $HOME/`date -j +%s`.txt' | at + 2 minutes

여러 명령의 경우 두 가지 옵션이 있습니다.

  1. 결합된 echo명령:

    (echo "command1"
     echo "command2"
     echo "command3" ) | at + 2 hours
    
  2. 임시 파일을 명령 목록으로 사용하십시오.

     tmp_file=$(mktemp --tmpdir uninstall_commands.XXXX)
     echo "command1" >> ${tmp_file}
     echo "command2" >> ${tmp_file}
     echo "command3" >> ${tmp_file}
     at -f ${tmp_file} + 2 hours
     rm -f -- ${tmp_file}
    

답변3

두 개의 스크립트가 있다고 가정합니다(뭔가를 잘해라;):

install.sh

#!/bin/sh -eu
sudo apt-get install phpmyadmin
sudo phpenmod mcrypt mbstring
printf 'Include /etc/phpmyadmin/apache.conf' >> /etc/apache2/apache2.conf
sudo service apache2 restart

uninstall.sh

#!/bin/sh -eu
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf

내가 생각할 수 있는 가장 간단한 대답은 정확히 당신이 원하는 것입니다

./install.sh && sleep 2h && ./uninstall.sh >>/var/log/mylog.log 2>&1

각 스크립트에는 서버에 연결하기 위한 ssh 명령도 포함되어 있습니다. 이 접근 방식은 서버 전원 주기에 탄력적이지만 엔드포인트에는 탄력적이지 않습니다.

대안으로 단순화하겠습니다.이 답변주로 atd가 출력을 배치하는 이상한 동작 때문에 대신 다음을 사용하십시오.

nohup sleep 2h && ./uninstall.sh >>/var/log/mylog.log 2>&1 &

일단 실행되면 이제 원하는 작업을 수행하는 데 약 2시간이 주어지며, 시간이 다 되면 제거 프로세스가 수행됩니다. 이 접근 방식은 서버 전원 순환을 수용하지 않습니다.

이 답변은 종속성을 방지하고 관련 출력을 신중하게 캡처하고 기록하여 진단/디버깅을 가능하게 합니다.

답변4

이 솔루션이 귀하의 요구 사항을 충족할지는 확실하지 않지만 시도해 볼 수는 있습니다.

지금 PC 종료/재부팅을 잊어버린 경우 터미널을 캡처하지 않고 bash에서 다음 명령을 실행할 수 있습니다(테스트를 위해 한 줄 명령으로 시도할 수 있음).

sleep 10 && yad --text="10 seconds passed" && exit &

위 명령은 예상하지 못했지만 터미널 창을 닫아도 작동합니다.

추신: 이것을 nohup과 결합하면 로그아웃하더라도 명령이 계속 실행됩니다.

해결 방법으로 초기 스크립트를 다음과 같이 설치용 스크립트와 제거용 스크립트 두 개로 분할할 수 있습니다.

#script_to_install.sh  
sudo apt-get install phpmyadmin
sudo phpenmod mcrypt mbstring
printf 'Include /etc/phpmyadmin/apache.conf' >> /etc/apache2/apache2.conf
sudo service apache2 restart
sleep 7200 && path/to/script_to_remove.sh &
exit #exit the first script to free terminal (or even close the terminal)
#end of script_to_install.sh

#script_to_remove.sh
#Optionally you can use xterm -e (or similar) to bring up a terminal window automatically to see the output of the commands
sudo phpdismod mcrypt mbstring
sudo apt-get purge phpmyadmin
sudo service apache2 restart
sed -i 's/Include \/etc\/phpmyadmin\/apache.conf/ /g /etc/apache2/apache2.conf
exit
#end of script_to_remove.sh

PC 재부팅 부분으로 돌아가서, 시작 시간을 임시 로그 파일에 기록하면 이 문제가 해결될 수 있다고 생각합니다. 일단 재부팅하면 해당 임시 파일을 모니터링하여(예: inotify 도구 사용) 경과 시간을 확인할 수 있습니다(테스트되지 않음) .

관련 정보