macos의 Atrun 명령이 시작되지 않습니다

macos의 Atrun 명령이 시작되지 않습니다

macOS에서 "at" 명령을 배우고 있습니다. 그러나 내 "at" 명령 작업이 예약되었지만 실행되지 않았습니다. 예를 들어, 다음과 같은 간단한 명령을 실행하면 echo "hello world" | at 9:30 AM출력이 생성되지 않습니다. 디렉토리 생성도 시도했지만 예상대로 작동하지 않았습니다. 이것은 내가 사용하는 스크립트입니다.

#!/bin/bash
mkdir at_file
touch at_file/files{001..100}.txt

atrun 서비스나 macOS 관련 기타 구성과 관련된 문제가 있는 것 같습니다. 제가 이해한 것이 맞다면 특히 macOS에서 이 문제를 해결하는 방법에 대한 지침을 주시면 감사하겠습니다.

또한 문제를 해결하기 위해 다음 단계를 시도했습니다.

먼저 다음 명령을 사용하여 atrun 서비스를 제거하고 로드하려고 했습니다.

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.atrun.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

그러나 두 번째 명령을 실행하면 "ALREADY RUNNING"이 출력으로 표시됩니다.

그런 다음 다음 명령을 사용하여 atrun 서비스를 중지하고 시작하려고 했습니다.

sudo launchctl stop com.apple.atrun
sudo launchctl start com.apple.atrun

그러나 launchctl list | grep com.apple.atrun을 사용하여 상태를 확인하면 출력이 생성되지 않습니다.

마지막으로 at -l 명령을 실행하여 모든 작업 ID와 스크립트를 나열했지만 작업이 실행되지 않았습니다.

"at" 명령을 사용하여 작업을 예약했지만 예상대로 실행되지 않는 것 같습니다. 왜 이런 일이 발생하는지 잘 모르겠습니다. 이 문제를 해결하는 데 도움이나 지침을 주시면 감사하겠습니다.

답변1

두 가지 이유:

(a) echo텍스트를 hello world파이프로 보내고 at실행할 명령으로 저장합니다. 명령이 hello존재하지 않아 작업이 실패했습니다. 를 사용하여 이 문제를 해결할 수 있습니다 echo "echo hello world" | at 9:30 AM. 개인적으로 저는 HereDoc으로 실행할 명령을 입력하는 것을 선호합니다.

(b) at시스템은 어느 터미널이 작업을 설정했는지 알지 못합니다. 작업은 백그라운드 스크립트에 의해 설정될 수도 있으며 어떤 경우에도 작업 설정과 작업 실행 사이에 터미널이 닫힐 수 있습니다. 따라서 작업에서 출력을 보낼 곳이 없습니다. at작업의 표준 입력은 /dev/null에 연결됩니다. 일반적으로 stdout 및 stderr은 리디렉션되지 않는 한 작업 소유자에게 이메일로 전송됩니다.

편집: 백그라운드에서 실행되는 작업의 경우 작은 단계를 수행하십시오. 모든 것을 문서화하고, 실제로 실행되었는지(그리고 언제) 증명하고, 디버그로 채우고, 실제로 발생한 일을 게시하세요.

~/Debug.atjob이 생성되면 at시스템이 작동하는 것입니다. 그렇지 않다면 그때가 바로 이전이 아니라 설치를 망칠 때입니다.

now + 1 minute또한 이 값은 가장 가까운 분 단위로 반올림됩니다 . at패키지의 일부였으며 cron단 1분만 차별되었습니다. cron작동하지 않으면 눈치챌 수 있습니다 .

$ ls -l ~/Debug.atjob at_file
ls: cannot access '/home/paul/Debug.atjob': No such file or directory
ls: cannot access 'at_file': No such file or directory
$ cat atBug
#! /bin/bash

{
    pwd
    date '+Began at %T'
    mkdir at_file
    echo "Status mkdir $?"
    ls -ld at_file
    touch at_file/files{001..100}.txt
    echo "Status touch $?"
    echo 'First three'
    ls -l at_file | head -n 3
    echo 'Last three'
    ls -l at_file | tail -n 3
    date '+Ended at %T'
} > ~/Debug.atjob 2>&1

$ date; echo './atBug' | at now + 1 minute; atq
Tue 18 Jul 09:06:48 BST 2023
warning: commands will be executed using /bin/sh
job 45 at Tue Jul 18 09:07:00 2023
45  Tue Jul 18 09:07:00 2023 a paul
$ sleep 60
$ cat ~/Debug.atjob
/home/paul
Began at 09:07:01
Status mkdir 0
drwxrwxr-x 2 paul paul 4096 Jul 18 09:07 at_file
Status touch 0
First three
total 0
-rw-rw-r-- 1 paul paul 0 Jul 18 09:07 files001.txt
-rw-rw-r-- 1 paul paul 0 Jul 18 09:07 files002.txt
Last three
-rw-rw-r-- 1 paul paul 0 Jul 18 09:07 files098.txt
-rw-rw-r-- 1 paul paul 0 Jul 18 09:07 files099.txt
-rw-rw-r-- 1 paul paul 0 Jul 18 09:07 files100.txt
Ended at 09:07:01
$ 

관련 정보