web-dev-qa-db-ja.com

起動アプリケーション(またはプロセス)の自動起動に失敗した場合に通知を表示する方法

自動起動にスクリプトを追加しました(LXSessionのデフォルトアプリケーションを使用)。後で、スクリプトを含むフォルダーを移動しました。

その結果、自動起動コマンドは静かに失敗していました。

失敗した自動起動コマンドに関する警告メッセージを有効にするにはどうすればよいですか?

4

以下の解決策はLubuntu専用ではなく、GUIから自動起動するアプリケーションをsetにする方法が少し異なるだけです。なぜならLubuntu Ubuntuのようなスタートアップアプリケーションアプリケーションはありません。

ログインから特定の制限時間内にスクリプトが開始したかどうかを確認します

以下のスクリプトを使用すると、ログインから一定の制限時間内にスクリプトが正常に開始されたかどうかを確認できます。スタートアップがunsuccessfulだった場合、どのスクリプトが正常に起動しなかったかを示すメッセージが表示されます。これを使用して、複数のスクリプトまたはプロセスを1ステップで確認できます。

enter image description here

制限時間が過ぎてメッセージを送信した後、スクリプトは終了します

使い方

  1. 次のスクリプトを空のファイルにコピーし、proc_check.pyとしてpermanent:)の場所に保存します。
  2. スクリプトの先頭で、監視するプロセス(スクリプト名)のリストを設定し、制限時間を設定します。
  3. (チェックする)プロセスが実行されていないことを確認し、次のコマンドでスクリプトをテスト実行します。

    python3 /path/to/proc_check.py
    

    制限時間が経過すると、警告が送信されます。

  4. すべてが正常に機能する場合は、以下のコマンドをスタートアップアプリケーションに追加します。

    python3 /path/to/proc_check.py
    

注:

notify-sendが利用可能な場合(Sudo apt-get install libnotify-bin)、最後の行のコメントを解除して、すべてがうまくいったかどうかを確認することもできます。

enter image description here

その利点は、eitherがすべて正常に完了したという通知または警告を取得し、どのプロセスが正常に起動しなかったかを示すことです。
誤ってthisスクリプトを移動した場合に気付くでしょう。 :)

スクリプト

#!/usr/bin/env python3
import subprocess
import getpass
import time

#--- set the processes (script names) to check below
procs = ["pscript_2.py", "monkey.py"]
#--- set the time limit below (seconds)
wait = 30
#---

# define the user to fetch the current user's process list
user = getpass.getuser()
# create an (empty) list of succesful process startups
succeeded = []

def get():
    return subprocess.check_output(["ps", "-u", user, "ww"]).decode("utf-8")

t = 1
while t < wait:
    # add succesful processes to the "succeeded" list
    for p in [proc for proc in procs if proc in get()]:
        succeeded.append(p)
    time.sleep(1)
    t = t+1

# list the failures
fails = [p for p in procs if not succeeded.count(p) > 2]
# if there are any, send a message
if len(fails) > 0:
    subprocess.Popen(["zenity", "--info", "--text", "failed to run: "+(", ").join(fails)])
# if all was successfull, send a message; n.b. comment out the line if notify-send is not available
else:
    # subprocess.Popen(["notify-send", "All processes started succesfully"])
    pass
7
Jacob Vlijm

スタートアッププログラムは/home/<your_username>/.config/autostart/

そして、crontabでこのようなものより:

awk -F'[= ]' '/^Exec/{print $2}' /home/<your_username>/.config/autostart/*.desktop | while IFS= read -r target; do [ ! -x "${target/\~/$HOME}" ] &&  ! type "${target/\~/$HOME}" &> /dev/null  && echo "Not executable: $target" | mail -s "Missing commands" <your_username>; done

Crontabを開きます:

crontab -e

次の行を追加します。

* */2 * * *       awk -F'[= ]' '/^Exec/{print $2}' /home/<your_username>/.config/autostart/*.desktop | while IFS= read -r target; do [ ! -x "$target" ] &&  ! type "$target" &> /dev/null  && echo "Not executable: $target" | mail -s "Missing commands" <your_username>; done

これにより、.config/autostart/問題がある場合は、2時間ごとにメールを送信します。

ありがとう @ terdon

4
A.B.