Чи є програмне забезпечення для періодичного запуску та закриття програми?


11

Приклад використання:

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


Це було б надзвичайно просто в сценарії. Чи запустив би програму, щоб перевірити? Якщо так, то яка команда запустити його?
Яків Влійм

З cronвами можна чітко запускати програми. Ви також можете створити cron a kill -15, але це залежить від програми, чи буде вона обробляти це як легкий поштовх, щоб вимкнути його, ігнорувати його або просто вийти з ладу.
Харальд

Відповіді:


9

Крон проти фонового сценарію

Звичайно, найперше, що спливе на розум, - це використовувати 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, у тебе дивовижний набір навичок! Дуже дякую за цей різдвяний подарунок. Ваш сценарій чудово працює. Як і "Перервіться", я міг би уявити, що цей сценарій перетвориться на хороший, просто графічний інтерфейс, де користувач може визначити додатки (програми), час циклу та час роботи програми. Потім GUI може працювати при запуску для підготовки програм, таких як Telegram або Skype. Як ти гадаєш?
orschiro

1
@orschiro звучить ідеально! Gui майже готовий до використання, з кількома змінами :). Приємного Різдва!
Яків Влійм

чи можна було б змусити програми відкривати мінімізовано або у фоновому режимі?
orschiro

@orschiro звичайно, що ти маєш на увазі?
Яків Влійм

1
Привіт @orschiro додав розділ до відповіді.
Яків Влійм

5
  1. Відредагуйте свій крон за допомогою 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 хв.


Привіт Раджа, ви б розглядали можливість голосування за це: askubuntu.com/tags/schedule/synonyms ?
Яків Влійм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.