"at" 명령은 쉘 스크립트를 실행하지 않습니다

"at" 명령은 쉘 스크립트를 실행하지 않습니다

특정 시간에 스크립트를 실행하고 싶습니다. at 명령이 해결책이라는 것을 알았으나 첨부한 쉘 스크립트가 실행되지 않았습니다. 아래에서 여러 명령을 사용했지만 아무 소용이 없습니다.

echo "`./time.sh`" | at -t 07101805

echo `./time.sh` | at -t 07101805

at -t 07101738 <./time.sh

at -t 07101737 -f ./time.sh

나는 또한 atrun다음 명령을 사용하기 시작했습니다.

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

직업 목록은 다음과 같습니다.

at -l

2020년 7월 10일 금요일 18:15:00

시간이 지남에 따라 목록에서 사라지며 이는 at 명령이 작동하지만 스크립트가 실행되지 않음을 의미합니다.

쉘 스크립트는 간단하며 다음과 같습니다.

#!/bin/sh

echo "the time is `date`" >time.txt

echo "yes the at command worked">>time.txt

다른 방법이 있다면 공유 부탁드립니다. 감사해요

답변1

at에는 고정된 시간과 직관적인 시간이라는 두 가지 시간이 필요합니다.

-t 202111231735는 2021년 11월 23일 17시 35분입니다.

이제 + 3일, 다음 주 화요일 12:00에 예상대로 하세요.

paul $ echo foo | at now + 3 days
warning: commands will be executed using /bin/sh
job 16 at Tue Jul 14 16:55:00 2020
paul $ date
Sat 11 Jul 16:56:02 BST 2020
paul $ echo foo | at 0700
warning: commands will be executed using /bin/sh
job 17 at Sun Jul 12 07:00:00 2020
paul $ echo foo | at 1200 next tuesday
warning: commands will be executed using /bin/sh
job 18 at Tue Jul 14 12:00:00 2020
paul $ atq
18  Tue Jul 14 12:00:00 2020 a paul
17  Sun Jul 12 07:00:00 2020 a paul
16  Tue Jul 14 16:55:00 2020 a paul
paul $

귀하의 백틱 명령은 완전히 잘못되었습니다. 즉시 스크립트를 실행하고 실제 표준 출력을 다가오는 작업에 채웁니다. 작업을 생성할 때 모든 출력을 리디렉션하면 작업이 실제로 비어 있도록 설정됩니다. 즉, 넣을 표준 출력이 없습니다.

at에서 여러 명령을 읽는 것도 결함이 있습니다. 그것들은 당신이 가지고 있는 쉘이 아닌 /bin/sh에 의해 실행될 것입니다. 실제로 몇 줄의 명령이 필요한 경우 HereDoc을 사용하고 작업을 생성할 때 또는 최종적으로 실행될 때 셸 확장이 발생하는지 매우 주의하세요.

스크립트 이름(및 모든 매개변수)을 at에 에코하세요. 그런 다음 at의 쉘은 shebang을 확인하고 올바른 쉘을 실행합니다. 또한 에서 아직 실제 스크립트를 읽지 않았기 때문에 스크립트에 수정한 내용이 작동하지 않습니다. 스크립트를 실행하기 전에 cwd와 환경을 복원하므로 경로 이름이 필요하지 않습니다.

날짜에 대한 직관적인 시간 지정은 (my Mint에) 문서화되어 있습니다 /usr/share/doc/at/timespec. Bachus-Naur 구문의 형태를 취하므로 그다지 편리하지는 않습니다. at 07101805정의되지 않은 토큰으로 구문 분석을 사용하면 CC >= 1900, CC == 00이 현재 세기이고 {01..18}의 CC가 1900을 기준으로 한다고 concatenated_date가정하는 것으로 보입니다 .MMDDCCYY

저장된 작업을 확인하세요. 예를 들면 다음과 같습니다.

paul $ at -c 18
#!/bin/sh
# atrun uid=1000 gid=1000
# mail paul 0
umask 22
XDG_VTNR=8; export XDG_VTNR
... 50 lies of setup.
COLORTERM=mate-terminal; export COLORTERM
XAUTHORITY=/home/paul/.Xauthority; export XAUTHORITY
cd /home/paul || {
     echo 'Execution directory inaccessible' >&2
     exit 1
}
foo

관련 정보