Có phần mềm để định kỳ bắt đầu và đóng một ứng dụng không?


11

Trường hợp sử dụng mẫu mực:

Tôi muốn khởi động Telegram Desktop định kỳ cứ sau 3 giờ trong 15 phút, để kiểm tra các tin nhắn mới đến. Sau 15 phút, ứng dụng sẽ đóng lại và khởi chạy lại sau 3 giờ tiếp theo.


Điều này sẽ cực kỳ dễ dàng để kịch bản. Sẽ bắt đầu ứng dụng làm, để làm cho nó kiểm tra? Nếu vậy, lệnh để chạy nó là gì?
Jacob Vlijm

Với cronbạn rõ ràng có thể bắt đầu chương trình. Bạn cũng có thể cron a kill -15, nhưng nó phụ thuộc vào ứng dụng cho dù nó xử lý nó như một cú huých nhẹ nhàng để tắt, bỏ qua nó hoặc chỉ gặp sự cố.
Harald

Câu trả lời:


9

Cron so với kịch bản nền

Tất nhiên, điều đầu tiên xuất hiện trong tâm trí là sử dụng cron. Cho dù bạn sử dụng cron, hoặc một kịch bản nền nhỏ chủ yếu là vấn đề của hương vị.

Ưu điểm của cron là nó kết nối với một tiến trình hiện có (mặc dù tập lệnh thêm vào, thực ra không có gì cho tải bộ xử lý).

Ưu điểm của kịch bản nền là linh hoạt hơn; chỉ cần giết nó và chạy nó với các đối số khác nếu bạn muốn thay đổi thời gian hoặc các cài đặt khác. Bạn cũng có thể sử dụng lại nó với các ứng dụng khác mà không cần phải thực hiện thiết lập khác, chỉ cần một lệnh là đủ.

Kịch bản dưới đây có thể được chạy bằng lệnh (ví dụ)

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

Trong trường hợp các đối số cuối cùng, nếu được thiết lập, mạnh mẽ giết ứng dụng. Nếu không được đặt, ứng dụng sẽ đóng một cách duyên dáng, để đảm bảo các thay đổi có thể, v.v. sẽ không bị mất.

Kịch bản

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

Để sử dụng

  • Sao chép tập lệnh vào một tập tin trống, lưu nó dưới dạng cycle_run.py
  • Chạy nó với lệnh:

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

    Ở đâu:

    • <command>là lệnh để chạy ứng dụng (không có phần --%u-section, trong trường hợp của tôi, được sao chép từ .desktoptệp /home/jacob/Downloads/Telegram/Telegram:)
    • <cycle_time> là (tổng số) thời gian chu kỳ tính bằng phút (3 giờ = 180 trong ví dụ của bạn)
    • <application_run_time> là thời gian ứng dụng sẽ chạy trong vài phút (15 trong ví dụ của bạn)
    • forcelà một đối số tùy chọn, để mạnh mẽ giết ứng dụng. Đơn giản chỉ cần để nó đi để duyên dáng giết ứng dụng.

Chạy các ứng dụng có đối số

Nếu bạn chạy một ứng dụng có đối số, hãy đảm bảo bạn sử dụng dấu ngoặc kép quanh lệnh để chạy ứng dụng , ví dụ:

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

Chạy các ứng dụng được thu nhỏ hoặc trong khay

Bắt đầu và chấm dứt các ứng dụng định kỳ thường sẽ chỉ cần được thu nhỏ và / hoặc trong khay. Theo yêu cầu của OP, một vài nhận xét về điều đó:

  • Nếu một ứng dụng cung cấp khởi động trong khay từ dòng lệnh, chỉ cần sử dụng đối số để làm như vậy. Trong trường hợp Telgram, đối số sẽ sử dụng là:

    -startintray
    

    mặc dù tùy chọn dường như không hoạt động trên tất cả các hệ thống (nó thực hiện trên máy của tôi), như đã đề cập ở đây . Bạn sẽ phải kiểm tra trong tình huống của bạn.

  • Nếu ứng dụng không cung cấp tùy chọn dòng lệnh để khởi động được thu nhỏ hoặc trong khay, tôi khuyên bạn nên sử dụng tập lệnh (này) kết hợp với tập lệnh ở đây (tôi đề xuất pidphiên bản -), để có thể khởi động các ứng dụng giảm thiểu.


Gửi @JacobVlijm, bạn có một bộ kỹ năng tuyệt vời! Cảm ơn bạn rất nhiều cho món quà Giáng sinh này. Kịch bản của bạn hoạt động tuyệt vời. Giống như "Nghỉ ngơi", tôi có thể tưởng tượng tập lệnh này biến thành một GUI đơn giản, đẹp mắt nơi người dùng có thể xác định (các) ứng dụng, thời gian chu kỳ và thời gian chạy ứng dụng. GUI này sau đó có thể chạy khi khởi động để chuẩn bị các ứng dụng như Telegram hoặc Skype. Bạn nghĩ sao?
orschiro

1
@orschiro nghe có vẻ hoàn hảo! Gui gần như đã sẵn sàng để sử dụng, với một vài thay đổi :). Chúc giáng sinh vui vẻ
Jacob Vlijm

nó có thể buộc các ứng dụng mở tối thiểu hoặc ở chế độ nền không?
orschiro

@orschiro dĩ nhiên, bạn có ý nghĩ gì?
Jacob Vlijm

1
Hi @orschiro đã thêm một phần vào câu trả lời.
Jacob Vlijm

5
  1. Chỉnh sửa cron của bạn với crontab -e và thêm dòng này vào crontab của bạn để chạy nó như công việc theo lịch trình cứ sau 3 giờ

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

2.Mở thiết bị đầu cuối của bạn và gõ lệnh dưới đây

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

mở killtelegram.sh với trình soạn thảo yêu thích của bạn và viết như dưới đây

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

Lưu và thoát

đó là nó. Nó sẽ tự động mở trong mỗi 3 giờ và nó sẽ tồn tại trong 15 phút và nó sẽ bị giết.


Xin chào Raja, bạn có xem xét việc bỏ phiếu về điều này không: askubfox.com/tags/schedule/synonymouss ?
Jacob Vlijm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.