มีซอฟต์แวร์ที่จะเริ่มและปิดแอปพลิเคชันเป็นระยะหรือไม่?


11

กรณีที่ใช้เป็นแบบอย่าง:

ฉันต้องการเริ่มต้นTelegram Desktopเป็นระยะทุก ๆ 3 ชั่วโมงเป็นเวลา 15 นาทีเพื่อตรวจสอบข้อความที่เข้ามาใหม่ หลังจาก 15 นาทีแอปพลิเคชันควรปิดอีกครั้งและเปิดตัวอีกครั้งหลังจาก 3 ชั่วโมงถัดไป


นี่จะเป็นสคริปต์ที่ง่ายมาก การเริ่มต้นแอปพลิเคชันจะทำเพื่อให้ตรวจสอบหรือไม่ ถ้าเป็นเช่นนั้นคำสั่งให้รันคืออะไร?
Jacob Vlijm

ด้วยcronคุณสามารถเริ่มโปรแกรมได้อย่างชัดเจน คุณสามารถ cron a ได้kill -15ด้วย แต่มันก็ขึ้นอยู่กับแอพพลิเคชั่นไม่ว่ามันจะจัดการกับมันในฐานะที่เป็นดุนอ่อนโยนที่จะปิดไม่สนใจมันหรือแค่เกิดปัญหา
Harald

คำตอบ:


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-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

แอปพลิเคชั่นที่กำลังรันอยู่ย่อเล็กสุดหรือในถาด

การเริ่มต้นและการยกเลิกแอปพลิเคชั่นเป็นระยะ ๆ มักจะต้องการเพียงย่อเล็กสุดและ / หรือในถาด ตามที่ร้องขอโดย OP มีข้อสังเกตเล็กน้อยดังนี้:

  • หากแอปพลิเคชันเริ่มต้นทำงานในถาดจากบรรทัดคำสั่งเพียงใช้อาร์กิวเมนต์เพื่อทำเช่นนั้น ในกรณีของTelgramอาร์กิวเมนต์ที่ใช้คือ:

    -startintray
    

    แม้ว่าตัวเลือกที่ดูเหมือนจะไม่ทำงานในระบบทั้งหมด (มันไม่เกี่ยวกับเหมือง) เป็นที่กล่าวถึงที่นี่ คุณจะต้องทดสอบในสถานการณ์ของคุณ

  • หากแอปพลิเคชันไม่มีตัวเลือกบรรทัดคำสั่งในการเริ่มต้นย่อให้เล็กสุดหรือในถาดฉันขอแนะนำให้ใช้สคริปต์ (นี่) ร่วมกับสคริปต์ที่นี่ (ฉันขอแนะนำpidรุ่น -) ซึ่งจะทำให้สามารถเริ่มต้นได้ แอปพลิเคชั่นลดลง


เรียน @JacobVlijm คุณมีทักษะที่ยอดเยี่ยม! ขอบคุณมากสำหรับของขวัญวันคริสต์มาสนี้ สคริปต์ของคุณใช้งานได้ดี เช่นเดียวกับ "หยุดพัก" ฉันสามารถจินตนาการถึงสคริปต์นี้ให้กลายเป็นสิ่งที่ดีเพียงแค่ GUI ที่ผู้ใช้สามารถกำหนดแอปพลิเคชันรอบเวลาและเวลาทำงานของแอปพลิเคชัน GUI นี้สามารถทำงานเมื่อเริ่มต้นเพื่อเตรียมแอปพลิเคชันเช่น Telegram หรือ Skype คุณคิดอย่างไร?
orschiro

1
@orschiro ฟังดูสมบูรณ์แบบ! gui เกือบพร้อมใช้แล้วโดยมีการเปลี่ยนแปลงเล็กน้อย :) ขอให้มีความสุขในวันคริสต์มาส!
Jacob Vlijm

เป็นไปได้ไหมที่จะบังคับให้แอปพลิเคชั่นเปิดย่อเล็กสุดหรือพื้นหลัง
orschiro

@orschiro นอกหลักสูตรคุณคิดอะไรอยู่
Jacob Vlijm

1
สวัสดี @orschiro เพิ่มหัวข้อในคำตอบ
Jacob Vlijm

5
  1. แก้ไข cron ของคุณด้วยcrontab -e และเพิ่มบรรทัดนี้ลงใน crontab ของคุณเพื่อเรียกใช้เป็นตารางงานทุก ๆ 3 ชั่วโมง

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

2. เปิด Terminal และพิมพ์คำสั่งด้านล่าง

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

เปิด killtelegram.sh ด้วยโปรแกรมแก้ไขที่คุณโปรดปรานและเขียนดังนี้

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

บันทึกและออก

แค่นั้นแหละ. มันจะเปิดอัตโนมัติทุก ๆ 3 ชั่วโมงและจะอยู่นาน 15 นาทีและจะถูกฆ่า


สวัสดีราชาคุณจะพิจารณาการลงคะแนนในเรื่องนี้: askubuntu.com/tags/schedule/synonymsหรือไม่
Jacob Vlijm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.