시작 시 대기열에서 작업 제거

시작 시 대기열에서 작업 제거

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.drc2.drc1.dK01

내가 무엇을 놓치고 있는지, 아니면 내가 뭘 잘못하고 있는지 아시나요?

답변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 * * * * ...

작동하지만 직관에 어긋납니다. 명확한 방법은 다음과 같습니다.

* * * * * ...

관련 정보