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
여러 명령의 경우 두 가지 옵션이 있습니다.
결합된
echo
명령:(echo "command1" echo "command2" echo "command3" ) | at + 2 hours
임시 파일을 명령 목록으로 사용하십시오.
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 도구 사용) 경과 시간을 확인할 수 있습니다(테스트되지 않음) .