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


18

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

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

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


4
at(일회성 실행)을 살펴보십시오 .
dirkt

14
이 작업을 수행하지 않았지만 로그인 스크립트가 시작 sudo shutdown -h +60되어 종료 (-halt) 프로세스에 대해 60 분의 카운트 다운 카운터를 시작할 수 있습니다. 취소하고 싶다면 할 수 있습니다 sudo shutdown -c (하지만 cron을 사용하지는 않습니다)
guiverc

7
작업의 성격에 따라 Docker 컨테이너 내에서 실행할 가치가 있으므로 서버를 끄는 것에 대해 걱정할 필요가 없습니다. 컨테이너가 생성되고 작업을 실행 한 후 폐기됩니다.
Vicente Olivert Riera

6
이로 인한 실질적인 보안 혜택을 기대하지 마십시오. 대부분의 취약점은 1 초 이내에 악용 될 수 있으므로 한 시간 후에 전원을 꺼도 악용을 막을 수는 없습니다. 또한 취약점을 발견 한 공격자는 공격을 수행하기 위해 컴퓨터의 전원이 켜질 때까지 기다릴 수 있습니다.
kasperd

2
Re : @kasperd의 의견에 따르면 실제로 온라인 상태에 관계없이 서버에서 정확히 같은 양의 보안이 필요하다고 말하고 싶습니다. 참고, 그것은 연결 있도록 서버의 무언가 수단의 것을 무언가 자동화 스윕이 아닌 당신에 대해, 그것의 어떤 종류의 연결과 그 때문에 최대 보안을 피할 수없는 모든 시간이 걱정 무엇인가 -이 켜져 때 알 유일한 방법.
StephenG

답변:


23

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

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

11
시간은 초가 아닌 분 단위입니다. 시도 shutdown -k -P 3600vs shutdown -k -P 60( -k벽 메시지를 인쇄하지만 다른 효과는 없습니다)
sebasth

12
그러나 먼저 명령을 한 번 시도하십시오. 즉각 종료가 프로필에 바인딩되는 것을 원하지 않습니다!
Fabian Röling

17
모든 ssh 로그인으로 인해 새로운 종료 호출이 발생한다고 생각합니다. 그러면 카운터가 재설정됩니까?
JoL

4
shutdown 맨 페이지에서 언급 한 것처럼 지난 5 분 동안 로그인이 허용되지 않을 수도 있습니다.
JoL

6
로그인 후 60 분은 부팅 후 60 분과 다릅니다. 머신을 부팅 한 다음 로그인을 잊어 버리면 어떻게됩니까?
Hagen von Eitzen

69

몇 가지 옵션이 있습니다.

  • 에 직접 시간을 제공하십시오 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 분 동안 종료를 지연시키는 대신 사용할 수도 있습니다 . 이렇게하면 종료가 발행되기 전 마지막 순간까지 로그인이 가능합니다.


2
나는 sleep명령으로 여전히 시간을 지정해야 한다고 생각 합니다. 우리는 이미 대기를 완료 한 경우 그 주장 shutdown에 사용하고 싶습니다 now(그러나 작업을 저장하기 전에 많은 경고를하지는 않습니다) 아래에서 사라집니다!).
Toby Speight

1
shutdown -P 60작동 하지만 명령을 호출하는 방법이 아닙니다. 매뉴얼 페이지에 따르면 사용해야합니다 shutdown -P +60. --- 또한 ​​시간 인수가없는 종료 (예 sleep 3600 && shutdown -P:)는 1 분 (예 :) 지연됩니다 shutdown -P +1. Toby Speight가 썼을 때 아마 사용하고 싶을 것입니다 shutdown -P now.
pabouk

33

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

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

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

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

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

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

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

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


2
이것은 매우 중요한 포인트입니다. 무엇을 구현하든 종료를 취소 할 수 있는지 확인하는 것이 좋습니다 .
Shadow

1
60m에서 여전히 실행 중이면 문제가 발생 했으므로 다시 시작하면됩니다. 이는 클라우드 측면에서 매우 비쌀 수 있습니다. 한 번에 종료를 보장하지 않으면 $ 4,000 이상을 돌려 받게됩니다.
mckenzm

8

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

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


동의하고 아마도 cron에서 하루 중 시간을 종료해야합니다. 이것은 죽은 사람의 브레이크입니다.
mckenzm

스크립트의 경우 @Abigail은 위에 있어야 .bashrc합니다. 우려가 명확하지 않은 것 같습니다. repl.it에서 예제 스 니펫을 공유 할 수 있습니까?
sdkks

@mckenzm 이해가되지 않습니다. 샘플 코드 또는 추가 설명을 공유 할 수 있습니까?
sdkks

5

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

다음과 같은 것 :

at now + 60 minutes -f /sbin/halt

이 작업은 바로 at골목입니다. at/var/spool/
sdkks

5
at재부팅 후에도이 컨텍스트 에서 사용 하지 않는 것이 좋습니다. OP가 로그인 한 후 수동으로 종료 한 다음 한 시간 동안 다시 로그인하면 첫 번째 예약 된 종료 프로세스에서 마지막 로그인 후 한 시간이 지나기 전에 시작됩니다.
Aaron

@Aaron 맞습니다. 그런 생각하지 않았습니다. 부팅 지속성은이 솔루션의주의 사항입니다.
sdkks

5

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

command --parameters && poweroff

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

command --parameters ; poweroff

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

command --parameters ; sleep 3600 ; poweroff

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

timeout 1h command --parameters ; poweroff

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


3

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


2
파일 시스템 손상?
Xen2050

@ Xen2050은 최신 (저널링) 파일 시스템에서 문제가되지 않습니다.
Tom

1
@Tom 저널링이있는 경우 강제 마운트 해제에 대한 소스가 파일 시스템 손상을 유발하지 않습니까? 나에게 새로운 소리, 나는 그것을 읽고 싶습니다. 최소한 파일 시스템을 더티로 표시해야합니다.
Xen2050

1
대부분의 경우 저널을 재생하고 완료해야합니다. 이 경우를 위해 특별히 설계된 ZFS와 같은 파일 시스템을 사용하지 않으면 전원이 꺼져 저널링 된 파일 시스템에서 파일 시스템이 손상되지 않아야합니다.
Tom

1
저널 재생이 실패 할 수 있습니다. 몇 주 전에 UPS가없는 시스템에서 1/2 초 동안 전원을 차단 한 후 fsck 세션이 매우 어려웠습니다. 저널과 함께 ext4를 사용하고있었습니다. 완전히 무적이 아닙니다!
Toby Speight

2

당신이있는 경우 systemd기계, 당신은 사용할 수있는 단순 타이머를

타이머 유닛 /etc/systemd/system/shutdown_after_an_hour.timer

[Unit]
Description=shutdown after an hour

[Timer]
OnBootSec=1h

[Install]
WantedBy=timers.target

타이머 유닛 /etc/systemd/system/shutdown_after_an_hour.service:

[Unit]
Description=shutdown after an hour

[Service]
ExecStart=/sbin/poweroff --force --no-wall
Type=oneshot

통해 활성화됩니다

# systemctl enable shutdown_after_an_hour.timer

상태 (특히 종료 전에 남은 시간)는 다음을 통해 사용할 수 있습니다.

# systemctl list-timers shutdown_after_an_hour.timer

다음에 다시 부팅 systemctl start할 때 작동합니다. 세션이 생성 될 때 (재부팅 중에 트리거되지 않았기 때문에) 한 시간이 지난 경우 즉시 시스템을 종료하므로 세션 을 만드는 동안에는 유용 하지 않습니다. 나는 실제로 어떤 일이 일어날 지 모르겠다. 나는 그 특정 사례를 테스트 한 적이 없다.


1

시작할 때 자동으로 실행되도록 스크립트 ( sudo shutdown -P 3600)를 /etc/init.d디렉토리 에 넣으십시오 .

또는 파일에 anacron명령을 추가 하여을 사용해보십시오 /etc/anacrontab. 또한 nohup로그 아웃 후에도 명령이 여전히 작동하는지 확인하기 위해 명령 앞에 사용하는 것이 좋습니다 .


1
배포판에 따라, 그것은 단지있는 init.d에있는에 의해 실행되지 수
sdkks

@ sdkks, 당신이 맞아요. Anacron도 고려할 수 있습니다. 스크립트를 / etc / anacrontab에 넣고 로그 아웃시 'nohup'과 함께 사용합니다.
Saveriofr

1
@Saveriofr 답변을 편집 하여 품질을 향상시킬 수 있습니다 (설명으로 추가 정보를 게시하는 것보다 낫습니다).
Anthony G-

1

쉘의 로그 아웃 파일 활용

UID에서 시작한 대화식 또는 비 대화식 작업에 서버 만 필요한 경우 종료 명령을 ~ / .bash_logout 파일에 넣는 것이 좋습니다. GNU 배쉬 설명서는 말한다 :

대화식 로그인 쉘이 종료되거나 비 대화식 로그인 쉘이 exit 내장 명령을 실행할 때 Bash는 ~ / .bash_logout 파일 (있는 경우)에서 명령을 읽고 실행합니다.

따라서 "sudo poweroff"또는 로그 아웃 파일과 유사한 기능을 추가 하면 현재 세션에서 로그 아웃 하거나 비대화 형 Bash 세션이 호출 될 때 서버의 전원이 꺼집니다 exit. 종료 를 연기하려는 경우 at 을 사용 하거나 종료 시간 지연을 선택할 수도 있습니다 .

이에 대한 대화식 접근 방식을 위해 다음 Bashism을 로그 아웃 파일에 넣을 수 있습니다.

# Shutdown unless N or n is pressed within 30 seconds.
shopt -s nocasematch
read -t 30 -N 1 -p 'Shutdown now? (Y/n) '
[[ "$REPLY" =~ n ]] || sudo poweroff

경고

이 솔루션에 대해 명심해야 할 몇 가지주의 사항이 있습니다.

  • 이것은 아마도 X Windows에서 시작한 터미널에서도 작동하지만 아마도 시작되지 않았 startx거나 유사한 X11 세션에서는 작동하지 않을 것입니다 .
  • 을 호출하는 비 대화식 스크립트 exit가있는 경우 예상치 못한 종료가 발생할 수 있습니다.
  • NOPASSWDshutdown 명령을 지정하지 않았 거나 sudo -vshutdown 명령을 실행하기 전에 전화 를 하지 않은 경우 sudoers 파일에 비밀번호를 묻는 메시지가 표시 될 수 있습니다 .
  • 아직 생각하지 못한 다른 경우가 있습니다.

즉,이 방법이 실제 요구를 충족하는지 또는 로그인 한 사용자가 없는지 모니터링하는 것과 같은 완전히 다른 방법 또는 다른 대안이 더 나은 방법인지 고려할 수 있습니다. 마일리지는 다를 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.