Apakah ada perangkat lunak untuk memulai dan menutup aplikasi secara berkala?

11

Contoh penggunaan teladan:

Saya ingin memulai Telegram Desktop secara berkala setiap 3 jam selama 15 menit, untuk memeriksa pesan yang baru masuk. Setelah 15 menit, aplikasi akan ditutup kembali dan diluncurkan kembali setelah 3 jam berikutnya.

orschiro
sumber
Ini akan sangat mudah untuk skrip. Apakah memulai aplikasi akan dilakukan, untuk memeriksanya? Jika demikian, apa perintah untuk menjalankannya?
Jacob Vlijm
Dengan cronAnda dapat dengan jelas memulai program. Anda juga bisa cron a kill -15, tetapi itu tergantung pada aplikasi apakah itu menangani itu sebagai dorongan lembut untuk menutup, mengabaikannya atau hanya crash.
Harald

Jawaban:

9

Skrip Cron versus latar belakang

Tentu saja hal pertama yang muncul dalam pikiran adalah menggunakannya cron. Apakah Anda menggunakan cron, atau skrip latar belakang kecil terutama masalah selera.

Keuntungan dari cron adalah ia terhubung pada proses yang sudah ada (meskipun sebuah skrip menambahkan, sebenarnya tidak ada apa - apa pada beban prosesor).

Keuntungan dari skrip latar belakang adalah lebih fleksibel; cukup bunuh dan jalankan dengan argumen lain jika Anda ingin mengubah waktu- atau pengaturan lainnya. Anda juga dapat menggunakannya kembali dengan aplikasi lain tanpa harus melakukan pengaturan lain, cukup dengan perintah saja.

Script di bawah ini dapat dijalankan oleh perintah (misalnya)

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

Di mana argumen terakhir, jika diatur, secara paksa membunuh aplikasi. Jika tidak disetel, aplikasi akan ditutup dengan anggun, untuk memastikan kemungkinan perubahan, dll. Tidak akan hilang.

Naskah

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

Menggunakan

  • Salin skrip ke file kosong, simpan sebagai cycle_run.py
  • Jalankan dengan perintah:

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

    dimana:

    • <command>adalah perintah untuk menjalankan aplikasi (tanpa --%u-bagian, dalam kasus saya, disalin dari .desktopberkas: /home/jacob/Downloads/Telegram/Telegram)
    • <cycle_time> adalah waktu siklus (total) dalam menit (3 jam = 180 pada contoh Anda)
    • <application_run_time> adalah waktu aplikasi harus berjalan dalam hitungan menit (15 dalam contoh Anda)
    • forceadalah argumen opsional, untuk mematikan aplikasi secara paksa . Biarkan saja untuk mematikan aplikasi dengan anggun .

Menjalankan aplikasi dengan argumen

Jika Anda menjalankan aplikasi dengan argumen, pastikan Anda menggunakan tanda kutip di sekitar perintah untuk menjalankan aplikasi , misalnya:

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

Menjalankan aplikasi diminimalkan atau di dalam baki

Memulai dan mengakhiri aplikasi secara berkala akan sering dibutuhkan hanya diminimalkan dan / atau di dalam baki. Seperti yang diminta oleh OP, beberapa komentar tentang itu:

  • Jika aplikasi menawarkan memulai di baki dari baris perintah, cukup gunakan argumen untuk melakukannya. Dalam kasus Telgram, argumen yang digunakan adalah:

    -startintray
    

    meskipun opsi tersebut tampaknya tidak bekerja pada semua sistem (tidak pada saya), seperti yang disebutkan di sini . Anda harus menguji dalam situasi Anda.

  • Jika aplikasi tidak menawarkan opsi baris perintah untuk startup yang diperkecil atau dalam baki, saya sarankan menggunakan skrip (ini) bersama dengan skrip di sini (saya sarankan pidversi -), yang akan memungkinkan startup. aplikasi diminimalkan.

Yakub Vlijm
sumber
@JacobVlijm yang terhormat, Anda memiliki keterampilan luar biasa! Terima kasih banyak atas hadiah Natal ini. Script Anda berfungsi dengan baik. Sama seperti "Istirahat", saya bisa membayangkan skrip ini berubah menjadi GUI yang bagus, di mana pengguna dapat menentukan aplikasi, waktu siklus dan waktu aplikasi berjalan. GUI ini kemudian dapat dijalankan saat startup untuk menyiapkan aplikasi seperti Telegram atau Skype. Bagaimana menurut anda?
orschiro
1
@orschiro terdengar sempurna! Gui hampir siap digunakan, dengan beberapa perubahan :). Selamat Natal!
Jacob Vlijm
apakah mungkin untuk memaksa aplikasi untuk membuka diminimalkan atau di latar belakang?
orschiro
@orschiro tentunya, apa yang ada dalam pikiran Anda?
Jacob Vlijm
1
Hai @orschiro menambahkan bagian pada jawabannya.
Jacob Vlijm
5
  1. Edit cron Anda dengan crontab -e dan tambahkan baris ini ke crontab Anda untuk menjalankannya sebagai pekerjaan jadwal setiap 3 jam

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

2. Buka terminal Anda dan ketik perintah di bawah ini

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

buka killtelegram.sh dengan editor favorit Anda dan tulis seperti di bawah ini

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

Simpan dan keluar

itu dia. Ini akan terbuka secara otomatis untuk setiap 3 Jam dan itu akan tetap selama 15 menit dan itu akan terbunuh.

rɑːdʒɑ
sumber
Hai Raja, apakah Anda akan mempertimbangkan memilih ini: askubuntu.com/tags/schedule/synonim ?
Jacob Vlijm