指定した時間にコマンドを実行する

指定した時間にコマンドを実行する

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プレーヤーがシステムにインストールされました。

次の 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 minute1分後にオーディオが再生されるという意味ではなく、現在の分から1分後に再生されるという意味なので、実際の再生時間は1分以下です。
  • at指定した時間にジョブが元のパスに移動するため、フルパスを提供する必要がありますcdatターゲット相対パスがそれ以外のパスである場合は機能しません。シェルスクリプトの内容を問い合わせてみると、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はGNOMEデスクトップ環境で重要な環境変数ですDBUS_SESSION_BUS_ADDRESSDISPLAYこれにより、一部の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ステートメントの半分を削除しないように注意してください。通常、DISPLAYGUIアプリケーションに必要なものを削除する必要はありません。

    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) &

関連情報