'at' 명령이 필수 프로그램/스크립트를 실행하지 않습니다.

'at' 명령이 필수 프로그램/스크립트를 실행하지 않습니다.

"at" 명령을 사용하여 스케줄링을 배우려고 하므로 테스트해보고 간단하게 유지하고 싶습니다. 예를 들어 "at 00:28"(내 시간대 형식) 을 입력한 다음 를 입력하면 /usr/bin/leafpadleafpad가 00:28에 시작될 것으로 예상됩니다. 하지만 그런 일은 일어나지 않았습니다. 기본적으로 아무 일도 일어나지 않습니다. 로 관련 작업 ID를 확인해보니 "at -c jobid"끝에 "실행 디렉터리에 접근할 수 없습니다"라고 나옵니다.

를 입력하면 "/usr/bin/leafpad"실제로 leafpad가 열리기 때문에 이것은 이상합니다.

그런데 저는 Kali Linux를 사용하고 있습니다.

답변1

Leafpad는 대화형 편집기입니다. at(또는 cron유사한 시설)을 통해 대화형 프로그램을 성공적으로 실행할 수 있는 경우는 거의 없습니다 . 이러한 상황에는 여러 가지 이유가 있지만 현재 가장 중요한 것은 이러한 시설이 사용자 환경과 완전히 분리되어 있고 사용자 환경에 대한 개념이 없다는 것입니다. 로그인 셸도 없고 PATH 변수도 없으며 일반적으로 터미널 세션과 관련된 것도 없습니다.

학습을 시작하는 더 좋은 방법은 단순히 시스템 로그에 메시지를 삽입하는 at이 명령을 사용하는 것입니다 . logger예는 다음과 같습니다:

$ echo "/usr/bin/logger 'This is a message'" | at now +10 minutes

/usr/bin/logger 'This is a message'이 명령은 실행 후 10분 후에 실행됩니다. 이 예를 사용하면 at해당 명령과 해당 명령이 호출하는 다른 실행 파일의 추가 사용법을 추론할 수 있습니다 .

답변2

실제로 유효한 셸 코드 조각을 실행 at하고 모든 일반적인 리디렉션을 수행할 수 있습니다. 따라서 "무엇을 실행할 수 있나요?"는 기본적으로 "터미널에 연결할 필요가 없는 모든 것"입니다. 지연된 작업을 시작한 터미널이 무엇인지, 터미널을 닫았는지 또는 지금 로그아웃했는지 여부는 알 수 없습니다.

at작업을 생성한 당시 환경의 스냅샷을 포함하는 대규모 스크립트를 생성합니다. (OLDPWD도 포함되어 있습니다!) 스크립트의 마지막 줄은 스크립트에 at지시하는 내용입니다. 이 시도:

$ at 2000
warning: commands will be executed using /bin/sh
at> { pwd; echo $HOME; echo $PATH; env; } >> At.env 2>&1
at> <EOT>
job 97 at Wed Mar  6 20:00:00 2024
$ #.. Show the script just created.
$ at -c 97 | wc -l
55
$ at -c 97 | head | cut -c 1-60
#!/bin/sh
# atrun uid=1000 gid=1000
# mail paul 0
umask 2
LS_COLORS=rs=0:di=01\;34:ln=01\;36:mh=00:pi=40\;33:so=01\;35
LESSCLOSE=/usr/bin/lesspipe\ %s\ %s; export LESSCLOSE
LANG=en_GB.UTF-8; export LANG
GDM_LANG=en_GB; export GDM_LANG
COMPIZ_CONFIG_PROFILE=mate; export COMPIZ_CONFIG_PROFILE
GTK_OVERLAY_SCROLLING=0; export GTK_OVERLAY_SCROLLING
$ #.. See the path, and the original command.
$ at -c 97 | tail
PATH=/home/paul/bin:/home/paul/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin; export PATH
SESSION_MANAGER=local/paul-RV415-RV515:@/tmp/.ICE-unix/1231,unix/paul-RV415-RV515:/tmp/.ICE-unix/1231; export SESSION_MANAGER
LESSOPEN=\|\ /usr/bin/lesspipe\ %s; export LESSOPEN
OLDPWD=/home/paul/D_Recovery; export OLDPWD
cd /home/paul || {
     echo 'Execution directory inaccessible' >&2
     exit 1
}
{ pwd; echo $HOME; echo $PATH; env; } >> At.env 2>&1

저장된 스크립트는 /bin/sh에서 실행됩니다(설치 중 링크된 항목에 관계 없음). 물론 예상 시간에 실행되는지 확인하기 위해 at실행할 수도 있습니다.date >> myAt.log

생성된 스크립트는 전달한 모든 텍스트와 마찬가지로 자체 shebang이 있기 때문에 at그 아래에서 실행됩니다 . sh그러나 해당 텍스트의 일부가 자체 shebang이 있는 스크립트를 실행하는 경우 커널은 해당 텍스트에서 실행되는 스크립트가 올바르게 번역되었는지 확인합니다.

이에 비해 동일한 코드 조각을 실행하면 cron매우 간단한 환경이 제공됩니다.

* * * * * { pwd; echo $HOME; echo $PATH; env; } >> Cron.env 2>&1

outputs

$ cat Cron.env
/home/paul
/home/paul
/usr/bin:/bin
LANGUAGE=en_GB:en
HOME=/home/paul
LOGNAME=paul
PATH=/usr/bin:/bin
LANG=en_GB.UTF-8
SHELL=/bin/sh
PWD=/home/paul
$ 

답변3

내 시스템에서는 echo mousepad | at now+1 minutes이미 마우스패드가 열려 있는 경우에만 마우스패드에 새 탭이 열립니다.

Leafpad를 사용하면 Leafpad를 열어도 아무 일도 일어나지 않습니다. 분명히 Leafpad에는 탭이 없습니다.

위에서 언급했듯이 atGUI 프로그램용으로 설계되지 않았습니다.

관련 정보