60 분 동안 실행 한 후 Linux 서버를 어떻게 종료합니까? 후에 자동으로

보안상의 이유로 일반적으로 꺼져있는 서버가 있습니다. 작업을 원할 때 스위치를 켜고 작업을 실행 한 후 다시 종료하십시오. 내 업무는 보통 15 분을 넘지 않습니다. 60 분 후에 자동으로 종료하는 메커니즘을 구현하고 싶습니다.

cron 으로이 작업을 수행하는 방법을 연구했지만 서버가 마지막으로 켜졌을 때 cron이 고려되지 않기 때문에 이것이 올바른 방법이라고 생각하지 않습니다. 주기적 패턴 만 설정할 수 있지만 해당 데이터는 고려하지 않습니다.

이 구현을 어떻게 수행 할 수 있습니까?



답변

매번 같은 사용자로 작업을 실행하는 경우, 선택적으로 -P 옵션과 함께 shutdown 명령을 프로필에 추가하면됩니다. 이 숫자는 종료 명령이 지연되는 시간 (분)을 나타냅니다. 사용자가 비밀번호없이 sudo를 통해 shutdown 명령을 실행할 수 있는지 확인하십시오.

echo "sudo shutdown -P +60" >> ~/.profile

답변

몇 가지 옵션이 있습니다.

  • 에 직접 시간을 제공하십시오 shutdown -P:

    shutdown -P +60
    

    참고 shutdown man 페이지는 또한 지적한다 :

    time 인수가 사용되면 시스템이 다운되기 5 분 전에 / run / nologin 파일이 작성되어 추가 로그인이 허용되지 않습니다.

  • at명령을 사용하십시오 .

  • 시작시 실행 되는 시스템 단위 파일 또는 init 스크립트 를 작성하십시오 shutdown -P 60.

  • @reboot부팅 후 cron을 사용 하여 명령을 실행 하십시오 .

    crontab에 추가 (루트) :

    @reboot shutdown -P +60
    

마지막 두 가지 방법의 경우 sleep 3600 && shutdown -P nowtime 인수 대신 shutdown60 분 동안 종료를 지연시키는 대신 사용할 수도 있습니다 . 이렇게하면 종료가 발행되기 전 마지막 순간까지 로그인이 가능합니다.


답변

이것은 XY 문제 처럼 보입니다 .

내 업무는 보통 15 분을 넘지 않습니다. 60 분 후에 자동으로 종료하는 메커니즘을 구현하고 싶습니다.

60 분 후에 종료하면 특히 복잡한 문제가 발생하여 더 많은 시간이 필요할 수 있습니다. 이전의 많은 솔루션들은 셧다운을 쉽게 지연시킬 수 없었습니다.

작업이 대화 형 작업이 아니라 다른 컴퓨터에서 자동으로 트리거되는 스크립트 작업 인 경우 @sdkks는 그에 대한 훌륭한 솔루션 을 제공했습니다. 스크립트와 모든 작업이 완료 되 자마자 전원을 끄도록 시스템을 작업해야합니다.

그러나 작업이 대화 형 작업 인 경우 유휴 감지를 수행하는 것이 좋습니다.

GUI (X11)에서 작업을 수행하는 경우 여기에 설명 된 방법을 사용하여 유휴 GUI 세션을 감지 할 수 있습니다. 시스템이 유휴 상태이고 다시 활성 상태 인 경우 명령 실행

터미널을 통해 작업을 수행하면 who명령을 사용하여 로그인 한 사용자를 감지 할 수 있습니다 . who빈 결과 가 반환 되면 시스템을 종료하는 크론 작업을 설정할 수 있습니다 . 이것은 상당히 보수적 인 접근 방식입니다. 콘솔을 연결된 상태로두고 유휴 상태 인 경우 시스템이 종료되지 않습니다.

당신은뿐만 아니라 좀 더 공격적이고 분리 유휴 터미널 세션 싶은 경우에, 당신은 함께 이전의 접근 방식을 결합 할 수 있습니다 자동으로 유휴 SSH 세션을 분리 ClientAliveInterval 하고 ClientAliveCountMax. SSH가 없지만 로컬 터미널 세션이있는 경우이를위한 또 다른 방법 은 명령에 의해 반환 된대로 터미널 유휴 시간 을 사용하는 것 w입니다.


답변

여기의 이전 답변은 모두 완벽 요구 사항을 충족하지만 작업이 완료되는 즉시 시스템 전원을 끌 수도 있습니다.

bash스크립트를 trapped 할 수 있습니다 . 즉, 특정 신호를 가로 채서 필요할 때 특정 작업을 실행할 수 있습니다. EXIT트랩 될 수있는 신호 중 하나입니다.

당신은 할 수있을 것입니다 :

  1. 자동화 된 셸 스크립트 trap를 설정합니다 EXIT. 즉 자동화 된 작업이 종료됩니다.
  2. 해당 시스템에서 로그 아웃 할 때마다 전원을 끄는를 의미 하는 trap로 설정하십시오 .bashrc EXIT.

옵션 # 1은 이상적인 검사가 될 수 있습니다. 단, 작업은 임시 검사와 수동 판단이 필요하지 않습니다.

옵션 # 2는 전원을 끄지 않고 터미널을 종료하는 것을 잊어 버린 경우를 다룹니다. 그러나 경고가 있습니다. 동일한 시스템에 여러 개의 터미널이 열려 있고 그 중 하나를 종료해도 여전히 시스템의 전원이 모두 동일하게 꺼집니다. (그것을 피하기 위해 스크립트를 작성할 수는 있지만 솔루션을 복잡하게 만들지는 않습니다.)

cleanup(){
    # Do some tasks before terminating
    echo oh la la, cleaning is so nice
    echo "See you later, world"
    sudo poweroff & # finally shutdown
}
trap cleanup EXIT

.bashrc옵션 # 2 의 끝에 , 옵션 # 1의 스크립트 상단에있을 수 있습니다.

poweroff스크립트 끝에서 왜 사용하지 않습니까?

set -eo pipefail스크립트 상단에 사용하는 것을 선호합니다 . 오류가 발생해도 자동으로 실패하지 않습니다. 더 많은 명령 실행을 중지합니다. trapof of EXITsignal은 오류로 인해 스크립트가 조기에 종료되는 경우를 포함해야합니다.

그러나 작업의 경우 시스템이 완료되기 전에 시스템이 종료 될 수도 있습니다.

bash스크립팅을보다 쉽게 ​​디버깅하기 위해 사용 하는 간단한 템플릿이 있습니다. 어쩌면 일부 사용되었을 수 있습니다. 이 요점을 참조하십시오 .


답변

@dirkt 의견에 정교하게, 당신은 삽입 할 수 있습니다 at에 명령을 당신 .bashrc이나 .profile또는 로그인시 쉘 사용 60 분 로그인 후 자동 종료를 예약하는 중 파일.

다음과 같은 것 :

at now + 60 minutes -f /sbin/halt

답변

다음은 command매개 변수와 함께 실행 되며 성공적으로 완료되면 사용자가 실행할 수 있다고 가정하면 즉시 상자가 꺼집니다 poweroff. 를 사용해야 할 수도 있습니다 sudo poweroff.

command --parameters && poweroff

다음 poweroff명령은 명령이 종료 될 때 즉시 실행됩니다.

command --parameters ; poweroff

완료 후 명령이 휴식 시간이 필요하다고 생각되면 다음을 실행하십시오.

command --parameters ; sleep 3600 ; poweroff

초과 근무 명령이 실행될 수 있다고 생각되면 한 시간으로 제한 할 수 있습니다.

timeout 1h command --parameters ; poweroff

timeoutcoreutils패키지의 일부 이므로 이미 패키지를 가지고있을 것입니다.


답변

보안이 정말로 염려된다면 전원에서 기계식 콘센트 타이머를 사용하십시오. 종료하려는 시간으로 설정하십시오. 이렇게하면 아무도 원격으로 로그인하여 종료를 비활성화 할 수 없습니다. 물리적 접근이 필요합니다.