지정된 시간에 명령 실행

지정된 시간에 명령 실행

at지정된 시간에 스크립트를 실행하는 명령 계획을 배웠습니다.

at -f -m ./test.sh now + 10 minutes

어떻게 at일정을 예약 할 수 있나요 command?

상황을 가정하면,

내 음악을 모두 검색하지만 백그라운드에서 소리 없이 실행됩니다.

find / -name *.mp3 1> ~/desktop/all_musics.md 2>/dev/null &

all_musics.md10분 후에 자동으로 열 계획이에요 .

open all_music.md at now + 10 minutes

이것을 달성하는 것이 가능합니까?

답변1

at은 다음 표준의 입력을 받아들입니다.

$ echo 'find / -name *.mp3 > ~/desktop/all_musics.md 2>/dev/null' | at now + 10 minutes

답변2

find /전체 시스템의 모든 파일을 검색하는 것은 효율적이지 않으므로 검색 경로를 좁혀야 합니다.

생각하다:

  • MP3 검색 경로는 다음과 같습니다.~/Downloads/misc/mp3/
  • 검색 결과를 재생 목록 경로에 저장~/Downloads/misc/mp3/my_mp3.list
  • 귀하의 시스템은 gnome 데스크탑 환경을 실행합니다.
  • mpv플레이어가 시스템에 설치되었습니다.

다음 한 줄 명령을 실행할 수 있습니다.

sudo service atd start;
(find ~/Downloads/misc/mp3/ -type f -iname '*.mp3' -print0 2>/dev/null >~/Downloads/misc/mp3/my_mp3.list &);
echo 'export "XDG_CURRENT_DESKTOP=GNOME";
export "GNOME_DESKTOP_SESSION_ID=this-is-deprecated";
export "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus";
export "DISPLAY=:0";
cat ~/Downloads/misc/mp3/my_mp3.list | xargs -0 mpv --player-operation-mode=pseudo-gui' | at now + 1 minute

설명하다:

  • sudo service atd start;atd아직 실행되고 있지 않은 경우 데몬을 시작합니다 .
  • at now + 1 minute1분 후에 오디오가 재생된다는 의미가 아니라 현재 분에서 1분 후에 재생된다는 의미이므로 실제 재생 시간은 1분 이하입니다.
  • at지정된 시간에 작업이 원래 경로로 이동하므로 전체 경로를 제공해야 합니다 cd. at대상 상대 경로가 그 이외의 경로이면 작동하지 않습니다. 쉘 스크립트의 내용을 쿼리 해 보면 at -c <pending_job_number>이를 알 수 있습니다 . 실행하여 atq보류 중인 작업 수를 알아보세요.
  • ( 2>/dev/null &);터미널에 대한 추가 출력을 억제하는 방법을 알아보세요.
  • -print0그리고 xargs -0파일 이름에 개행 특수 문자가 포함되어 있어도 파일 이름을 재생할 수 있도록 만듭니다.
  • --player-operation-mode=pseudo-guimp3는 오디오 전용이고 기본적으로 제어할 수 있는 비디오 GUI 팝업이 없기 때문에 그렇게 해야 합니다 . 그리고 그것을 넣지 마십시오 xargs -o. 작동하지 않습니다 atd.
  • XDG_CURRENT_DESKTOP, GNOME_DESKTOP_SESSION_ID, DBUS_SESSION_BUS_ADDRESSDISPLAYGNOME 데스크탑 환경에서 중요한 환경 변수입니다. 이를 통해 일부 GUI 응용프로그램이 제대로 작동하고 표시될 수 있습니다. mp3를 재생 하는 경우 mpv주요 변수는 입니다 DISPLAY.

cron과 같은 다른 데몬과 마찬가지로 atd아래에 언급된 것처럼 GUI 애플리케이션이 제대로 작동하도록 하는 환경 변수도 부족합니다 man at.

at 및 배치 모두에서 명령은 표준 입력 또는 -f 옵션으로 지정된 파일에서 읽고 실행됩니다. 작업 디렉터리, 환경(변수 BASH_VERSINFO 제외, 전시하다, EUID, GROUPS, SHELLOPTS, TERM, UID 및 _) 및 umask는 호출 시점부터 유지됩니다.

전시하다다른 GUI 응용 프로그램에는 충분하지 않을 수 있습니다. 이 경우 소스 코드를 자세히 조사하지 않고도 시스템의 프로그램에 필요한 환경 변수를 찾을 수 있습니다.

  1. declare -p > /tmp/d.sh환경변수 이름의 속성과 값을 저장하기 위해 실행합니다 . env > /tmp/d.sh따옴표를 제거하고 직접 재사용하기에는 적합하지 않으므로 사용을 권장합니다 declare -p > /tmp/d.sh.

  2. 다음 위치에 저장하세요 /tmp/test.sh.

    . /tmp/d.sh
    mpv --player-operation-mode=pseudo-gui foo.mp3
    
  3. 그리고 스크립트를 계속 테스트하세요. 제대로 재생되면 절반을 삭제하여 범위를 좁히세요 /tmp/d.sh. 그렇지 않으면 삭제한 내용을 취소하고 다른 부분을 삭제해 보세요. 그러나 declare진술 의 절반을 삭제하지 않도록 주의하십시오 . 그리고 DISPLAY일반적으로 GUI 애플리케이션에 필요한 항목을 제거할 필요가 없습니다 .

    env -i bash /tmp/test.sh

  4. 마지막으로 프로그램의 주요 환경 변수를 얻을 수 있습니다. env -i모든 환경 변수를 제거한 다음 나머지 환경 변수를 가져오는 것이 개념입니다 .

  5. 이 방법은 모든 기능이 제대로 작동한다고 보장하지 않습니다. 예를 들어 일부 기능에는 다른 변수가 필요할 수 있으므로 프로그램이 느리게 시작됩니다. 기능을 찾으려면 이 단계를 반복해야 합니다.

sleep또한 다음 명령의 존재를 잊지 마십시오 .

( (find ~/Downloads/misc/mp3/ -type f -iname '*.mp3' -print0 2>/dev/null >~/Downloads/misc/mp3/my_mp3.list) & pid=$!; sleep 600; kill -9 $pid 2>/dev/null; cat ~/Downloads/misc/mp3/my_mp3.list | xargs -0 mpv --player-operation-mode=pseudo-gui) &

관련 정보