보안상의 이유로 일반적으로 종료되는 서버가 있습니다. 작업하고 싶을 때 열어서 작업을 수행한 다음 다시 닫습니다. 내 과제는 대개 15분을 넘지 않습니다. 60분 후에 자동으로 종료되는 메커니즘을 구현하고 싶습니다.
이를 위해 cron을 사용하는 방법을 살펴봤지만, cron은 서버가 마지막으로 열린 시간을 고려하지 않기 때문에 그것은 올바른 방법이 아니라고 생각합니다. 주기적인 패턴만 설정할 수 있지만 데이터는 고려되지 않습니다.
이 구현을 어떻게 할 수 있나요?
답변1
몇 가지 옵션이 있습니다.
직접 시간 제공
shutdown -P
:shutdown -P +60
알아채다
shutdown
매뉴얼 페이지또한 다음과 같이 지적했습니다.시간 매개변수를 사용하는 경우 더 이상의 로그인이 허용되지 않도록 시스템 종료 5분 전에 /run/nologin 파일이 생성됩니다.
사용
at
주문하다.크론 사용
@reboot
시작 후 명령을 실행하십시오.(루트) crontab에 추가:
@reboot shutdown -P +60
후자의 두 가지 방법의 sleep 3600 && shutdown -P now
경우 시간 매개변수를 사용하여 종료를 60분 지연할 수도 있습니다 shutdown
. 이렇게 하면 닫기 전까지 마지막 순간까지 로그인할 수 있습니다.
답변2
이것은 다음과 같습니다XY 문제.
내 과제는 대개 15분을 넘지 않습니다. 60분 후에 자동으로 종료되는 메커니즘을 구현하고 싶습니다.
60분 후에 종료하면 더 많은 시간이 필요한 특히 복잡한 문제가 발생할 수 있습니다. 이전의 많은 솔루션은 종료가 지연되는 경향이 없었습니다.
작업이 대화형 작업이 아니지만 다른 컴퓨터에서 자동으로 트리거되는 스크립트 작업인 경우 @sdkks는 다음을 제공합니다.좋은 해결책이렇게 하려면 스크립트와 모든 작업이 완료되는 즉시 시스템을 종료해야 합니다.
그러나 작업이 대화형인 경우 대신 유휴 감지를 수행하는 것이 좋습니다.
GUI(X11)에서 작업을 수행하는 경우 여기에 설명된 방법을 사용하여 유휴 GUI 세션을 감지할 수 있습니다.시스템이 유휴 상태일 때와 다시 활성화될 때 명령을 실행합니다.
터미널을 통해 이 작업을 수행하는 경우 이 who
명령을 사용하여 로그인된 사용자를 감지할 수 있습니다. who
빈 결과가 반환되면 머신을 종료 하는 cronjob을 설정할 수 있습니다 . 이는 상당히 보수적인 접근 방식입니다. 콘솔을 연결했지만 유휴 상태로 두면 시스템이 종료되지 않습니다.
보다 적극적으로 유휴 터미널 세션의 연결을 끊으려면 이전 방법을 다음과 결합할 수 있습니다.유휴 SSH 세션 자동 연결 끊기 ClientAliveInterval
그리고 ClientAliveCountMax
. SSH는 없지만 로컬 터미널 세션이 있는 경우 다른 방법은 터미널을 사용하는 것입니다.게으른명령이 반환되는 시간입니다 w
.
답변3
매번 동일한 사용자로 작업을 실행하는 경우 구성 파일에 shutdown 명령(선택적으로 -P 옵션 사용)을 추가하기만 하면 됩니다. 이 숫자는 종료 명령이 지연되는 시간(분)을 나타냅니다. 사용자가 비밀번호 없이 sudo를 통해 종료 명령을 실행할 수 있는지 확인하세요.
echo "sudo shutdown -P +60" >> ~/.profile
다음에 추가:
대부분의 다른 답변을 읽은 후 (루트) cron에 "@reboot /<path to script/command>"를 추가하는 옵션이 마음에 듭니다. 세바스가 내놓은 대답은 네 번째 선택이었다. 종료 명령을 추가하거나 종료를 수행하고 cron을 통해 실행하는 작은 스크립트를 작성할 수 있습니다. WoJ에는 systemd를 사용하는 경우에도 좋은 솔루션이 있습니다.
답변4
다음 명령은 command
매개변수와 함께 실행되며 성공적으로 완료되면 상자가 즉시 닫힙니다(사용자가 실행할 수 있다고 가정) poweroff
. 사용해야 할 수도 있습니다 sudo poweroff
.
command --parameters && poweroff
그리고 다음 명령은 poweroff
명령이 종료되면 즉시 실행됩니다.
command --parameters ; poweroff
명령이 완료된 후 중단이 필요하다고 생각되면 다음을 실행하세요.
command --parameters ; sleep 3600 ; poweroff
명령이 시간 초과될 수 있다고 생각되면 명령을 1시간으로 제한할 수 있습니다.
timeout 1h command --parameters ; poweroff
timeout
은 패키지의 일부 coreutils
이므로 이미 가지고 있을 것입니다.