示例用例:
我想开始Telegram 桌面版每 3 小时定期检查一次,每次 15 分钟,以检查是否有新收到的消息。15 分钟后,应用程序应再次关闭,并在接下来的 3 小时后重新启动。
答案1
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>
是运行应用程序的命令(没有-section--%u
,在我的情况下,是从文件复制.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 的要求,对此有几点说明:
答案2
编辑你的 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 分钟,然后就会被杀死。