crontab이 현재 로그인한 사용자의 세션과 상호 작용하도록 하려면 어떻게 해야 합니까?

crontab이 현재 로그인한 사용자의 세션과 상호 작용하도록 하려면 어떻게 해야 합니까?

질문

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-nonprintingcatLFD 및 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/shecho이 플래그를 지원하지 않는 내장 기능이 있는 일부 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

관련 정보