미래 특정 시간에 단일 이벤트가 발생하도록 예약하는 쉬운 방법은 무엇입니까?

미래 특정 시간에 단일 이벤트가 발생하도록 예약하는 쉬운 방법은 무엇입니까?

내 컴퓨터가 작업을 수행하기를 원하는 경우가 많지만 지금은 그렇지 않습니다. 예를 들어, 30분 후에 퇴근 시간을 알려주도록 설정할 수 있습니다. 아니면 대부분의 사람들이 사무실을 떠났을 것이라고 확신하는 2시간 후에 복잡한 테스트를 실행하고 싶을 수도 있습니다.

하루 중 특정 시간에 실행할 크론 작업을 생성할 수 있다는 것을 알고 있지만, 제가 원하는 것은 "이 스크립트를 10분 안에 실행"과 같은 간단한 것뿐이고, 얼마나 오래 걸리는지 파악해야 하기 때문에 작업량이 많은 것 같습니다. 실제로는 지금부터 X분/시간/일이 소요됩니다. 완료되면 크론 작업을 삭제하세요.

물론 이 스크립트를 작성하여 백그라운드에서 실행할 수도 있습니다.

sleep X
do_task

하지만 이것은 투박해 보입니다. 각 작업에 대해 새 스크립트가 필요하거나, 내가 원하는 작업을 수행할 수 있을 만큼 일반적인 스크립트를 작성하고 유지 관리해야 하며, 분 단위로 몇 초가 있는지 계산해야 한다는 점은 말할 것도 없습니다. 내가 원하는 시간 또는 며칠.

이 문제에 대한 확립된 해결책은 없나요?

답변1

나는 간단한 스크립트를 사용합니다 at.

#!/bin/bash
# email reminder notes using at(1)...

read -p "Time of message? [HH:MM] " time
read -p "Date of message? [dd.mm.yy] " date
read -p "Message body? " message

at "$time" "$date" <<EOF
echo "$message" | mailx -s "REMINDER" [email protected]
EOF

이메일 대신 데스크톱 알림을 원할 경우 또는 $message으로 쉽게 파이프할 수 있습니다 notify-send.dzen

답변2

일반적인 사용법at

하고 싶은 일을 수행하는 스크립트를 작성하세요. 모든 외부 명령에 대한 전체 경로를 사용하고 올바른 로그 파일이나 이메일에 출력을 기록하십시오.

테스트 스크립트.

활성화해at -f YOURSCRIPT -t MMDDhhmm

답변3

2023년 현재 많은 배포판에서 기본적으로 이 작업을 비활성화하므로 systemd이 작업을 완료하는 대신 사용하고 싶을 수 있습니다 .atatd

다음과 같이 systemctl을 사용할 수 있습니다.

systemd-run --user --on-calendar=<iso time> <command> [arguments...]

예를 들어

systemd-run --user --on-calendar="2023-11-03 07:00" /usr/bin/aplay /home/user/chime.wav

그러면 명령을 실행한 후 삭제되는 임시 타이머가 생성됩니다. --on-calendar에 대한 인수에 별표가 포함된 경우(예: --on-calendar=")--* 07:00", 이 명령은 매일 실행됩니다.

구성된 모든 타이머 목록을 얻으려면 다음을 사용하십시오.

systemctl --user list-timers

관련 정보