at
저는 Ubuntu 18.04.6 LTS를 사용하고 있으며 매분마다 특정 대기열에 대한 자동 종료 명령을 예약하는 cronjob이 있습니다 .
$ crontab -e
*/1 * * * * [ -z "$(w -h)" ] && echo "/sbin/shutdown -h now" | at -q w "now + 1 hour"
지금 내가 겪고 있는 문제는 지금부터 +1시간 사이에 머신을 수동으로 중지하고(실행 예정인 작업이 있음을 의미) 다음 날 머신을 다시 시작하면 즉시 다시 종료된다는 것입니다.
at
시스템이 다시 시작되면 만료된 작업이 실행된 것으로 나타납니다. 물론 이게 짜증나기 때문에 기계가 다시 시작되면 이 작업들을 삭제해야겠다고 생각했습니다.
대기열에서 모든 작업을 제거하는 스크립트를 만들었습니다 /usr/sbin/remove_shutdown_jobs
.
#!/bin/bash
jobs=$(atq -q w | cut -f1); if [ -n "$jobs" ]; then atrm $jobs; fi;
나는 그것을 실행 가능하게 만들었습니다.
$ ls -lah /usr/sbin/remove_shutdown_jobs
-rwxr-xr-x 1 root root 81 Aug 22 12:06 /usr/sbin/remove_shutdown_jobs
rc5.d
그런 다음 디렉터리 에 연결 하고 S00
실행할 수 있도록 이름을 지정해 보았습니다.앞으로 atd
시작됨(내 추측으로는 at 데몬이 시작되기 전에 작업을 삭제해야 한다는 것입니다. 그렇지 않으면 이전 작업을 선택하여 실행할 수 있습니다):
$ ln -s /usr/sbin/remove_shutdown_jobs /etc/rc5.d/S00remove_shutdown_jobs
$ ln -lah
lrwxrwxrwx 1 root root 30 Aug 31 13:49 S00remove_shutdown_jobs -> /usr/sbin/remove_shutdown_jobs
...
lrwxrwxrwx 1 root root 13 Jun 16 17:21 S01atd -> ../init.d/atd
...
그러나 스크립트가 실행되지 않는 것 같습니다. 파일에 일부 텍스트를 추가하는 간단한 에코 스크립트를 사용하여 시도했지만 이 역시 실행되지 않았습니다. 나는 rc5.d
올바른 디렉토리라고 생각합니다 . 왜냐하면
$ runlevel
N 5
나는 또한 성공 하지 못하고 rc4.d
연결 을 시도했습니다 . 이것은 일종의 구조 시스템에만 해당되고 거기에는 파일만 있기 때문에 링크하지 않았습니다 (kill?).rc3.d
rc2.d
rc1.d
K01
내가 무엇을 놓치고 있는지, 아니면 내가 뭘 잘못하고 있는지 아시나요?
답변1
줄 사이를 읽은 후 여기에 XY 문제가 있는 것 같습니다.
귀하의 의도를 올바르게 이해했다면 질문 X는 "시스템이 한 시간 동안 실행된 후 마지막 사용자가 로그오프한 후 시스템이 자동으로 중지되기를 원합니다."입니다.
문제에 대해 선택한 솔루션 at
으로 인해
나는 문제 X에 대한 더 깨끗한 해결책을 사용하여 문제 Y를 제거할 것을 제안합니다.
누군가 로그인되어 있는지 확인하고, 그렇다면 60초 후에 확인을 다시 지연하는 작은 스크립트를 만듭니다. 아무도 로그인하지 않으면 시스템을 중지하십시오.
# cat << EOF > /root/bin/check-for-halt.sh
#!/usr/bin/env bash
# If anyone is logged in, wait sixty seconds, then check again.
while [ -n "$(w -h)" ] && sleep 60
do
:
done
# If no one is logged in, halt the system.
[ -z "$(w -h)" ] && /sbin/shutdown -h now
EOF
# chmod 700 /root/bin/check-for-halt.sh
그런 다음 해당 crontab
줄을 다음으로 바꾸십시오.
@reboot root sleep 3600 && /root/bin/check-for-halt.sh
필요에 맞게 sleep 60
합계 값을 조정할 수 있습니다 . sleep 3600
이 방법을 사용하면 재부팅할 때마다 대기열을 지울 필요가 없습니다 at
.
답변2
init 스크립트를 실행하려면 다음과 같은 서문을 추가해야 합니다.
#!/bin/sh
### BEGIN INIT INFO
# Provides:
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO
이는 스크립트가 실행 중인 실행 수준에 대한 정보를 init 하위 시스템에 제공합니다. 또한 중지하는 방법, 시작하는 방법 등에 대한 정보도 제공해야 합니다.
그리고 cron
다음과 같이 기록되었습니다.
*/1 * * * * ...
작동하지만 직관에 어긋납니다. 명확한 방법은 다음과 같습니다.
* * * * * ...