Bir uygulamayı periyodik olarak başlatmak ve kapatmak için yazılım var mı?


11

Örnek kullanım durumu:

Yeni gelen iletileri kontrol etmek için Telegram Desktop'ı 15 dakikada bir 3 saatte bir periyodik olarak başlatmak istiyorum . 15 dakika sonra uygulama tekrar kapanmalı ve önümüzdeki 3 saat sonra yeniden başlatılmalıdır.


Bunu yazmak son derece kolay olurdu. Uygulamayı başlatmak kontrol etmek için yapar mıydı? Öyleyse, çalıştırma komutu nedir?
Jacob Vlijm

İle cronprogramları açıkça başlatabilirsiniz. Ayrıca cron a da yapabilirsiniz kill -15, ancak uygulamaya kapatmak için hafif bir dürtme olarak mı, yoksayar mı yoksa sadece çökerse mi bağlıdır.
Harald

Yanıtlar:


9

Cron ve arka plan komut dosyası

Elbette akla ilk gelen şey kullanmaktır cron. İster cron kullanın, ister küçük bir arka plan komut dosyası kullanın, esasen bir zevk meselesidir.

Cron'un avantajı, varolan bir işlemi bağlamasıdır (bir komut dosyası , işlemci yüküne aslında hiçbir şey eklemese de).

Bir arka plan komut dosyasının avantajı daha esnek olmasıdır; zamanı veya diğer ayarları değiştirmek isterseniz onu öldürün ve diğer argümanlarla çalıştırın. Başka bir kurulum yapmak zorunda kalmadan diğer uygulamalarla da kullanabilirsiniz, sadece bir komut yeterlidir.

Aşağıdaki komut dosyası komutla çalıştırılabilir (örn.)

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

Son argümanın ayarlanması durumunda uygulamayı zorla öldürür. Ayarlanmazsa, uygulama olası değişikliklerin vb. Kaybolmayacağından emin olmak için zarif bir şekilde kapanır.

Senaryo

#!/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)

Kullanmak

  • Komut dosyasını boş bir dosyaya kopyalayın, cycle_run.py
  • Komutuyla çalıştırın:

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

    nerede:

    • <command>uygulamayı çalıştırmak için komut (olmadan --%ukopyalanan benim durumumda, -bölümü, .desktopdosyanın: /home/jacob/Downloads/Telegram/Telegram)
    • <cycle_time> dakika cinsinden (toplam) döngü süresi (örneğin 3 saat = 180)
    • <application_run_time> uygulamanın dakika cinsinden çalışması gereken süredir (örneğin örnekte 15)
    • forceuygulamayı zorla öldürmek için isteğe bağlı bir argüman . Uygulamayı incelikle öldürmek için basitçe bırakın .

Uygulamaları bağımsız değişkenlerle çalıştırma

Bağımsız değişkenleri olan bir uygulama çalıştırırsanız, uygulamayı çalıştırmak için komutun çevresinde tırnak işareti kullandığınızdan emin olun , örneğin:

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

Uygulamaların simge durumuna küçültülmüş veya tepside çalıştırılması

Uygulamaların periyodik olarak başlatılması ve sonlandırılması genellikle yalnızca simge durumuna küçültülmüş ve / veya tepsi içinde gerekir. OP tarafından talep edildiği gibi, bununla ilgili birkaç açıklama:

  • Bir uygulama tepsiden komut satırından başlatılmayı teklif ederse , bunu yapmak için argümanı kullanmanız yeterlidir. Durumunda Telgram, kullanımına argümanı:

    -startintray
    

    seçenek burada belirtildiği gibi tüm sistemlerde (benimkinde işe yaramaz) çalışmıyor gibi görünüyor . Durumunuzu test etmeniz gerekecek.

  • Uygulama, simge durumuna küçültülmüş veya tepsiye başlamak için komut satırı seçeneğini sunmazsa, (bu) komut dosyasını buradakiyle birlikte kullanmanızı öneririm ( pid- sürümünü öneririm ), bu da başlatmayı mümkün kılacaktır uygulama küçültüldü.


Sevgili @ JacobVlijm, inanılmaz bir beceri setiniz var! Bu Noel hediyesi için çok teşekkür ederim. Senaryonuz harika çalışıyor. "Bir Mola" ile aynı, bu uygulama kullanıcı (lar), döngü süresi ve uygulama çalışma süresi tanımlayabilirsiniz güzel, basit bir GUI dönüştürmek için hayal edebiliyorum. Bu GUI daha sonra Telegram veya Skype gibi uygulamalar hazırlamak için başlangıçta çalışabilir. Ne düşünüyorsun?
orschiro

1
@orschiro mükemmel geliyor! GUI neredeyse birkaç değişiklikle kullanıma hazırdır :). İyi Noeller!
Jacob Vlijm

uygulamaları simge durumuna küçültülmüş veya arka planda açılmaya zorlamak mümkün mü?
orschiro

@orschiro kurs dışı, aklında ne var?
Jacob Vlijm

1
Merhaba @orschiro cevaba bir bölüm ekledi.
Jacob Vlijm

5
  1. Cron'unuzu ile düzenleyin crontab -e ve her 3 saatte bir zamanlama işi olarak çalıştırmak için bu satırı crontab'ınıza ekleyin

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

2. terminalinizi açın ve aşağıdaki komutu yazın

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

favorate editörünüzle killtelegram.sh dosyasını açın ve aşağıdaki gibi yazın

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

Kaydet ve çık

bu kadar. Her 3 saatte bir otomatik olarak açılacak ve 15 dakika boyunca kalacak ve öldürülecektir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.