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

11

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

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

orschiro
источник
Это было бы чрезвычайно легко написать. Будет ли запускать приложение, чтобы оно проверялось? Если да, то какая команда запустить его?
Якоб Влейм
С cronвас можно четко запускать программы. Вы также можете выполнить cron a kill -15, но это зависит от того, будет ли приложение обрабатывать его как легкий толчок для выключения, игнорирования или просто сбоя.
Харальд

Ответы:

9

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-сече-, в моем случае, скопированная из .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- версию), что позволит запустить приложение свернуто.

Якоб Влейм
источник
Уважаемый @JacobVlijm, у вас потрясающий набор навыков! Большое спасибо за этот рождественский подарок. Ваш скрипт отлично работает. Так же, как и «Сделай перерыв», я мог бы представить, что этот скрипт превратится в приятный, простой графический интерфейс, в котором пользователь может определить приложение (я), время цикла и время выполнения приложения. Этот графический интерфейс может запускаться при запуске для подготовки приложений, таких как Telegram или Skype. Как вы думаете?
Орширо
1
@orschiro звучит идеально! Графический интерфейс почти готов к использованию, с некоторыми изменениями :). Счастливого Рождества!
Джейкоб Влейм
Можно ли заставить приложения открываться в свернутом или в фоновом режиме?
Орширо
@orschiro конечно, что ты имеешь в виду?
Джейкоб Влейм
1
Привет @orschiro добавил раздел к ответу.
Джейкоб Влейм
5
  1. Отредактируйте свой cron с помощью crontab -e и добавьте эту строку в ваш 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 минут и будет убит.

rɑːdʒɑ
источник
Привет Раджа, не могли бы вы проголосовать за это: askubuntu.com/tags/schedule/synonyms ?
Джейкоб Влейм