at
지정된 시간에 스크립트를 실행하는 명령 계획을 배웠습니다.
at -f -m ./test.sh now + 10 minutes
어떻게 at
일정을 예약 할 수 있나요 command
?
상황을 가정하면,
내 음악을 모두 검색하지만 백그라운드에서 소리 없이 실행됩니다.
find / -name *.mp3 1> ~/desktop/all_musics.md 2>/dev/null &
all_musics.md
10분 후에 자동으로 열 계획이에요 .
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 minute
1분 후에 오디오가 재생된다는 의미가 아니라 현재 분에서 1분 후에 재생된다는 의미이므로 실제 재생 시간은 1분 이하입니다.at
지정된 시간에 작업이 원래 경로로 이동하므로 전체 경로를 제공해야 합니다cd
.at
대상 상대 경로가 그 이외의 경로이면 작동하지 않습니다. 쉘 스크립트의 내용을 쿼리 해 보면at -c <pending_job_number>
이를 알 수 있습니다 . 실행하여atq
보류 중인 작업 수를 알아보세요.( 2>/dev/null &);
터미널에 대한 추가 출력을 억제하는 방법을 알아보세요.-print0
그리고xargs -0
파일 이름에 개행 특수 문자가 포함되어 있어도 파일 이름을 재생할 수 있도록 만듭니다.--player-operation-mode=pseudo-gui
mp3는 오디오 전용이고 기본적으로 제어할 수 있는 비디오 GUI 팝업이 없기 때문에 그렇게 해야 합니다 . 그리고 그것을 넣지 마십시오xargs -o
. 작동하지 않습니다atd
.XDG_CURRENT_DESKTOP
,GNOME_DESKTOP_SESSION_ID
,DBUS_SESSION_BUS_ADDRESS
는DISPLAY
GNOME 데스크탑 환경에서 중요한 환경 변수입니다. 이를 통해 일부 GUI 응용프로그램이 제대로 작동하고 표시될 수 있습니다. mp3를 재생 하는 경우mpv
주요 변수는 입니다DISPLAY
.
cron과 같은 다른 데몬과 마찬가지로 atd
아래에 언급된 것처럼 GUI 애플리케이션이 제대로 작동하도록 하는 환경 변수도 부족합니다 man at
.
at 및 배치 모두에서 명령은 표준 입력 또는 -f 옵션으로 지정된 파일에서 읽고 실행됩니다. 작업 디렉터리, 환경(변수 BASH_VERSINFO 제외, 전시하다, EUID, GROUPS, SHELLOPTS, TERM, UID 및 _) 및 umask는 호출 시점부터 유지됩니다.
전시하다다른 GUI 응용 프로그램에는 충분하지 않을 수 있습니다. 이 경우 소스 코드를 자세히 조사하지 않고도 시스템의 프로그램에 필요한 환경 변수를 찾을 수 있습니다.
declare -p > /tmp/d.sh
환경변수 이름의 속성과 값을 저장하기 위해 실행합니다 .env > /tmp/d.sh
따옴표를 제거하고 직접 재사용하기에는 적합하지 않으므로 사용을 권장합니다declare -p > /tmp/d.sh
.다음 위치에 저장하세요
/tmp/test.sh
.. /tmp/d.sh mpv --player-operation-mode=pseudo-gui foo.mp3
그리고 스크립트를 계속 테스트하세요. 제대로 재생되면 절반을 삭제하여 범위를 좁히세요
/tmp/d.sh
. 그렇지 않으면 삭제한 내용을 취소하고 다른 부분을 삭제해 보세요. 그러나declare
진술 의 절반을 삭제하지 않도록 주의하십시오 . 그리고DISPLAY
일반적으로 GUI 애플리케이션에 필요한 항목을 제거할 필요가 없습니다 .env -i bash /tmp/test.sh
마지막으로 프로그램의 주요 환경 변수를 얻을 수 있습니다.
env -i
모든 환경 변수를 제거한 다음 나머지 환경 변수를 가져오는 것이 개념입니다 .이 방법은 모든 기능이 제대로 작동한다고 보장하지 않습니다. 예를 들어 일부 기능에는 다른 변수가 필요할 수 있으므로 프로그램이 느리게 시작됩니다. 기능을 찾으려면 이 단계를 반복해야 합니다.
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) &