Есть ли программное обеспечение для периодического запуска и закрытия приложения?

10

Примерный вариант использования:

Я хотел бы начать Telegram Desktop периодически каждые 3 часа в течение 15 минут, чтобы проверить наличие новых входящих сообщений. Через 15 минут приложение должно закрыть его снова и снова запустить через следующие 3 часа.

    
задан orschiro 24.12.2015 в 19:36
источник

2 ответа

7

Cron по сравнению с фоновым скриптом

Конечно, самое первое, что приходит в голову, - использовать cron . Используете ли вы cron или небольшой фоновый скрипт, в основном, это вопрос вкуса.

Преимущество cron заключается в том, что он подключается к существующему процессу (хотя скрипт добавляет, ну, фактически ничего к загрузке процессора).

Преимущество фонового скрипта - это более гибкое; просто убейте его и запустите с другими аргументами, если вы хотите изменить временные или другие настройки. Вы также можете повторно использовать его с другими приложениями без необходимости выполнять другую настройку, достаточно просто выполнить команду.

Сценарий ниже может быть запущен командой (например.)

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

Если последний аргумент, если установлен, принудительно убивает приложение. Если это не задано, приложение будет закрываться изящно, чтобы убедиться, что возможные изменения и т. Д. Не будут потеряны.

Скрипт

#!/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 -section, в моем случае, скопировано из файла .desktop : /home/jacob/Downloads/Telegram/Telegram )
    • <cycle_time> - это (общее) время цикла в минутах (3 часа = 180 в вашем примере).
    • <application_run_time> - время, в течение которого приложение должно запускаться в минутах (15 в вашем примере).
    • force - необязательный аргумент, чтобы принудительно убить приложение. Просто оставьте его изящно убить приложение.

Запуск приложений с аргументами

Если вы запустите приложение с аргументами, убедитесь, что вы используете кавычки вокруг команды для запуска приложения , например:

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

Запуск приложений сведен к минимуму или в лотке

Периодически периодически запускаемые и завершающие приложения часто необходимы только для минимизации и / или в лотке. По просьбе ОП, несколько замечаний по этому поводу:

  • Если приложение предлагает запустить в лотке из командной строки, просто используйте этот аргумент. В случае Telgram аргумент для использования:

    -startintray
    

    , хотя этот вариант, похоже, не работает во всех системах (он работает на моем), как упоминалось здесь . Вам придется протестировать в вашей ситуации.

  • Если приложение не предлагает параметр командной строки для запуска с минимальным или в лотке, я бы предложил использовать этот скрипт в сочетании с здесь (я бы предложил pid - версию), что позволит запустить приложение с минимальным значением.

ответ дан Jacob Vlijm 24.12.2015 в 21:35
источник
4
  1. Отредактируйте свой cron с помощью crontab -e и добавьте эту строку в свой crontab, чтобы запустить ее как задание расписания на каждые 3 часа.

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

2. Откройте терминал и введите команду ниже

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

откройте killtelegram.sh с вашим редактором favorate и напишите ниже

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

Сохранить и выйти

вот оно. Он будет открываться автоматически каждые 3 часа, и он будет оставаться на 15 минут, и он будет убит.     

ответ дан Ten-Coin 24.12.2015 в 20:47