질문
Crontab은 작동하지만 사용자와 상호 작용하는 대신 그냥 거기에 앉아 있습니다. 자동 인식 프롬프트 출력을 통해 crontab이 현재 로그인한 사용자와 대화하도록 하려면 어떻게 해야 합니까? 예를 들어, 사용자 1에게 1분마다 울리는 모닝콜, 알람 시계, 사용자 1은 컴퓨터 앞에서 눈과 귀를 뜨는 것 외에는 메시지를 받기 위해 아무것도 할 필요가 없습니까?
사이드 노트 분당 타이밍... - 물론 이것은 단지 기술적인 예일 뿐이며 실제로는 더 의미 있고 유용한 타이밍이 선택됩니다.
이것을 상상해 보세요
컴퓨터 = 꺼짐
User1 = 데이브
데이브:
*switching on computer*
*logs into his user account "dave"*
*lands in GUI desktop*
*starts mate-terminal*
누가 로그인했는지, 무엇을 하고 있는지 확인하세요.
dave@LocalMachine:~$ w
12:46:42 up 4:22, 2 users, load average: 0.18, 0.44, 0.43
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
dave tty7 :0 08:24 4:22m 6:57 0.31s mate-session
/tmp/에 실행 가능한 bash 스크립트 "alarm_clock"을 생성합니다.
dave@LocalMachine:~$ emacs -nw /tmp/alarm_clock && chmod +x /tmp/alarm_clock
# Alarm clock displaying current time and ringing.
#
# Copyleft
답변1
^G
특징
먼저 이렇게 하면 echo '\a'
벨소리를 받는 단말에서 벨이 울립니다. 8진수 값이 007인 ASCII 코드입니다. 이는 CTRL+G(`^G)를 누르는 것과 같습니다.
man 7 ascii에서:
Oct Dec Hex Char Oct Dec Hex Char
────────────────────────────────────────────────────────────────────────
000 0 00 NUL '\0' (null character) 100 64 40 @
001 1 01 SOH (start of heading) 101 65 41 A
002 2 02 STX (start of text) 102 66 42 B
003 3 03 ETX (end of text) 103 67 43 C
004 4 04 EOT (end of transmission) 104 68 44 D
005 5 05 ENQ (enquiry) 105 69 45 E
006 6 06 ACK (acknowledge) 106 70 46 F
007 7 07 BEL '\a' (bell) 107 71 47 G
일반적으로 이 문자는 보이지 않습니다.
$ echo -e "$(date) \a"
Tue Jan 2 18:31:38 IST 2024
그러나 명령에 / 플래그를 추가하면 -v
이를 볼 수 있습니다(--show-nonprinting
cat
LFD 및 TAB을 제외하고 ^ 및 M- 표기법을 사용합니다.):
$ echo -e "$(date) \a" |cat -v
Tue Jan 2 18:31:40 IST 2024 ^G
따라서 이 ASCII 코드를 (터미널 대신) 파일에 작성할 때 8진수 007 문자 값을 파일에 쓰기만 하면 됩니다. "삐" 소리가 들리는 것은 터미널에 쓸 때만입니다.
-e
사용되지 않음echo
스크립트의 또 다른 문제점은 #!
Shebang( )으로 시작하지 않고 주석으로 시작한다는 것입니다. 이 경우에는 #!/bin/bash
무시되며 스크립트가 에 의해 실행될 수 있습니다 /bin/sh
. 바라보다 man 5 crontab
:
여러 환경 변수는 cron(8) 데몬에 의해 자동으로 설정됩니다. SHELL이 /bin/sh로 설정됨 [...]
/bin/sh
echo
이 플래그를 지원하지 않는 내장 기능이 있는 일부 POSIX 호환 쉘이 시스템에 있을 수 있습니다 -e
(POSIX는 이 플래그를 정의하지 않으며 일반적으로 확장일 뿐입니다). 이 경우 -e
에코하려는 문자열의 일부로 사용됩니다 . 꼭 사용하고 싶으신 분들 bash
은 댓글로 옮겨주세요뒤쪽에셰르본.
또한 이 경우에는 를 사용하는 것이 더 좋습니다 printf
. 예를 들면 다음과 같습니다.printf "$(date) \a\n"
실제 터미널로 메시지 보내기
우리가 말했듯이 파일에 쓸 때 터미널과 상호 작용하지 않고 파일에 일부 문자를 쓰기만 하면 됩니다. 터미널에 메시지를 보내려면 다음을 사용하는 것이 좋습니다.write(1)
, 사용자의 마지막 활성 tty에 메시지를 보냅니다. 예를 들어:
printf "$(date)\a\n" | write <USER>
이 경우 사용자는 활성 셸에서 다음과 같은 메시지를 받게 됩니다.
Message from root@locahost on pts/0 at 19:00 ...
Tue Jan 2 19:00:49 IST 2024
EOF
또는 모든 사용자와 터미널에 메시지를 보내려면 다음을 사용하십시오.wall(1)
.
printf "$(date)\a\n" | wall