是否有用于定期启动和关闭应用程序的软件?


11

示例用例:

我想每隔3小时定期启动Telegram Desktop,持续15分钟,以检查是否有新收到的消息。15分钟后,该应用程序应再次关闭,并在接下来的3小时后重新启动。


这将非常容易编写脚本。要启动应用程序进行检查吗?如果是这样,运行它的命令是什么?
Jacob Vlijm 2015年

有了cron您就可以清楚地启动程序。您也可以cron a kill -15,但是它取决于应用程序是将其作为关闭,忽略它还是只是崩溃来进行处理。
哈拉尔德2015年

Answers:


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
    

    虽然选择似乎不是在所有系统上工作(它在我的),如提及这里。您将必须根据自己的情况进行测试。

  • 如果应用程序不提供最小化启动或在托盘中启动的命令行选项,我建议将(this)脚本与此处的脚本结合使用(建议使用pid-版本),这将使启动成为可能应用程序最小化。


亲爱的@JacobVlijm,您有一套了不起的技能!非常感谢您的圣诞节礼物。您的脚本效果很好。与“休息”一样,我可以想象这个脚本变成一个不错的,简单的GUI,用户可以在其中定义应用程序,周期时间和应用程序运行时间。然后,该GUI可以在启动时运行以准备应用程序,例如Telegram或Skype。你怎么看?
orschiro 2015年

1
@orschiro听起来很完美!该gui几乎可以使用了,并做了一些更改:)。圣诞快乐!
Jacob Vlijm 2015年

是否可以迫使应用程序最小化或在后台打开?
orschiro

@orschiro当然,您有什么想法?
Jacob Vlijm 2015年

1
嗨@orschiro在答案中添加了一部分。
Jacob Vlijm

5
  1. 使用编辑您的cron,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分钟,并且会被杀死。


嗨,拉贾(Raja),您是否会考虑对此进行投票:askubuntu.com/tags/schedule/synonyms
Jacob Vlijm '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.