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
プレーヤーがシステムにインストールされました。
次の 1 行コマンドを実行できます。
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
はGNOMEデスクトップ環境で重要な環境変数ですDBUS_SESSION_BUS_ADDRESS
。DISPLAY
これにより、一部の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) &