web-dev-qa-db-ja.com

アプリケーションを定期的に起動および終了するソフトウェアはありますか?

ユースケースの例:

Telegram Desktop を3時間ごとに15分間定期的に開始して、新しく着信するメッセージをチェックしたいと思います。 15分後、アプリケーションは再び閉じられ、次の3時間後に再起動されます。

11
orschiro

Cron対バックグラウンドスクリプト

もちろん、最初に頭に浮かぶのは、cronを使用することです。 cronを使用するか、小さなバックグラウンドスクリプトを使用するかは、主に好みの問題です。

Cronの利点は、既存のプロセスに接続することです(ただし、スクリプトは実際にはnothingをプロセッサの負荷に追加します)。

バックグラウンドスクリプトの利点は、柔軟性が高いことです。時間やその他の設定を変更したい場合は、単に強制終了して他の引数で実行します。また、別のセットアップを行わなくても、他のアプリケーションで再利用できます。コマンドだけで十分です。

以下のスクリプトは、コマンドで実行できます(例)

python3 <script> <command_to_run_application> <cycle_time> <application_run_time> force

最後の引数が設定されている場合、forcefullyはアプリケーションを強制終了します。設定しない場合、アプリケーションは正常に終了し、可能な変更などが失われないようにします。

スクリプト

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

force = False
args = sys.argv[1:]; app = args[0].replace("'", "")
proc = app.split()[0].split("/")[-1]
cycle = int(args[1])*60; run = int(args[2])*60

try:
    if args[3] == "force":
        force = True
except IndexError:
    pass

def get_pid(proc_name):
    try:
        return subprocess.check_output(
            ["pgrep", proc_name]
            ).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        pass

def kill(pid, force):
    if force == False:
        subprocess.Popen(["kill", "-s", "TERM", pid])
    Elif force == True:
        subprocess.Popen(["kill", pid])

while True:
    subprocess.Popen(["/bin/bash", "-c", app])
    time.sleep(run)
    pid = get_pid(proc)
    if pid != None:
        kill(pid, force)
    time.sleep(cycle - run)

使用するには

  • スクリプトを空のファイルにコピーし、cycle_run.pyとして保存します
  • 次のコマンドで実行します:

    python3 /path/to/cycle_run.py <command> <cycle_time> <application_run_time> force
    

    どこ:

    • <command>は、アプリケーションを実行するコマンドです(私の場合、--%uセクションなしで、.desktopファイルからコピー:/home/jacob/Downloads/Telegram/Telegram
    • <cycle_time>は(合計)サイクル時間(分)です(例では3時間= 180)
    • <application_run_time>は、アプリケーションを数分で実行する時間です(例では15)
    • forceはオプションの引数で、forcefullyアプリケーションを強制終了します。アプリケーションを強制終了するgracefullyのままにしておきます。

引数付きのアプリケーションの実行

引数を指定してアプリケーションを実行する場合は、コマンドを引用符で囲んでアプリケーションを実行してください。例:

python3 /path/to/cycle_run.py 'gedit /home/jacob/Desktop/test.sh' 30 5

最小化されたアプリケーションまたはトレイでのアプリケーションの実行

アプリケーションを定期的に起動および終了するのに必要なのは、最小化されたトレイまたはトレイだけです。 OPからの要求に応じて、それについていくつかのコメントがあります

  • Ifアプリケーションがコマンドラインからトレイでの起動を提供する場合は、引数を使用して起動します。 Telgramの場合、使用する引数は次のとおりです。

    -startintray
    

    here で述べたように、このオプションはすべてのシステムで機能するとは限りません(私のシステムでは機能します)。状況に応じてテストする必要があります。

  • アプリケーションが最小化またはトレイで起動するコマンドラインオプションを提供しない場合、 ここにあるものpid-バージョンを提案します)と組み合わせて(this)スクリプトを使用することをお勧めします、最小化されたアプリケーションの起動を可能にします。

9
Jacob Vlijm
  1. crontab -eでcronを編集し、crontabにこの行を追加して、3時間ごとにスケジュールジョブとして実行します

    00 */3 * * * * ~/killtelegram.sh >/dev/null 2>&1 
    

2.ターミナルを開き、以下のコマンドを入力します

touch ~/killtelegram.sh
chmod +x ~/killtelegram.sh

お好みのエディターでkilltelegram.shを開き、次のように記述します

#!/bin/bash
telegram &
sleep 15m
pkill telegram

保存して終了

それでおしまい。 3時間ごとに自動的に開き、15分間とどまり、殺されます。

4
rɑːdʒɑ