只允许进程在 x 到 y 小时之间运行

只允许进程在 x 到 y 小时之间运行

我使用移动数据连接服务。我只在上午 9 点到下午 4 点之间拥有不受限制的带宽。

我想知道如何在该计划之外“静音”诸如 Dropbox 小程序之类的应用程序。

我考虑过用这个脚本替换 Dropbox 二进制文件:

#!/bin/bash
H=`date +"%H"`
if (($H >= 9 && $H < 16))
then
    echo "run dropbox here"
fi

我想知道是否有人有更好的主意。也就是说,在我的解决方案中,Dropbox 将在下午 4 点之后继续运行,并且如果计算机在上午 9 点之前通电,则将无法启动。如果使用 wifi 时不施加任何限制,那就太酷了。

我想知道是否有人有任何解决方案系统或者计划任务或一些这样的。我知道这些工具非常强大,但除此之外我一无所知。

(我的系统:XUbuntu 15.04,即xfce4和systemd)

答案1

用于cron启动守护进程并终止它。由于 dropbox 以用户身份运行,因此请以用户身份编辑 cronjob:crontab -e并在编辑器中放置:

0 9 * * * $HOME/bin/dropbox-daemon-path
59 16 * * * pkill -u "$LOGNAME" dropbox-daemon-process-name

上午 9 点,它启动 Dropbox 守护进程(您应该在此处提供完整路径),并在下午 5 点之前 1 分钟,它终止它(对于该用户)。

我很想听听有人给出systemd答案。

编辑:正如吉尔斯指出的,如果系统是这样的话,这将没有帮助已通电9 到 17 之间。同样,这种 cronjob 方法不是最优的,但我不知道如何将 dropbox 与systemd.话虽如此,我们在包装脚本中尝试您原来的方法,如果时间超出您的界限,该脚本就会退出:

#!/bin/bash
hour=$(date +%H)
[ $hour -lt 09 -o $hour -gt 16 ] && exit
#else
exec path-to-dropbox-daemon

稍微修改一下crontab

* 9-16 * * * $HOME/bin/dropbox-wrapper-script
59 16 * * * sleep 50; pkill -u "$LOGNAME" dropbox-daemon-process-name

对我来说,这并不漂亮。每分钟你的脚本都会被 cron 执行,留下几行日志。但应该是有效的。

答案2

设置cron作业在特定时间运行;正如@Janis 提到的,这可能采用以下条目的形式:

0       9 * * * bin chmod +x /usr/bin/dropbox
0-59/10 * * * * root  /usr/local/bin/maybe-stop dropbox

修改:正如我最初编写的那样,每 10 分钟运行一次是疯狂的矫枉过正,因为只有超级用户才能将其更改回+x,所以更好的想法可能是:

0 9  * * * bin chmod +x /usr/bin/dropbox
0 16 * * * root  /usr/local/bin/maybe-stop dropbox

哪里/usr/local/bin/maybe-stop

#!/bin/bash
RESTRICT_PROGRAM=$1
WIFI_DEVICE=wlo1

BEGIN_FREE=9
END_FREE=16

if [ $(date +%H) -ge $BEGIN_FREE -a $(date +%H) -lt $END_FREE ]
then
    # We have free broadband: allow it.
    chmod +x /usr/bin/$RESTRICT_PROGRAM
elif ip addr show dev $WIFI_DEVICE | grep '   inet' | grep -q global
then
    # We have WiFi: allow it.
    chmod +x /usr/bin/$RESTRICT_PROGRAM
elif
else
    chmod -x /usr/bin/$RESTRICT_PROGRAM
    if [ $(date +%H) -lt $BEGIN_FREE -o $(date +%H) -ge $END_FREE ]
    then
        PIDS=$(fuser /usr/bin/$RESTRICT_PROGRAM 2>/dev/null | cut -d: -f2)
        kill -SIGTERM $PIDS
        sleep 3
        kill -SIGKILL $PIDS
    fi
fi

第二部分是链接相同的脚本以在网络配置更改时运行:

/etc/NetworkManager/dispatcher.d/dropbox-check

#!/bin/sh
exec /usr/local/bin/maybe-stop dropbox

答案3

一种选择cron是在 9:00 设置一个 cronjob,在 16:00 设置一个 cronjob,创建(或删除)一个标志文件在某个地方。包装器会检查它是否存在标志文件以确定是否启动应用程序。

如果您的应用程序在 16:00 之前启动并且在 16:00 之后仍然运行,那么您当然可以 - 假设您事先不知道运行持续多长时间 - 终止该应用程序(例如由 cronjob 启动)。

答案4

timeStart=`date --date='8AM' +"%s"`
timeStop=`date --date='23:59:00' +"%s"`
now=`date +"%s"`

if (($now >= $timeStart && $now < $timeStop))
then
        #CRON JOBS BETWEEN 8AM AND 12PM
        echo "NO BEER"
else
        #CRON JOBS OUTSIDE OF 8AM AND 12PM
        echo "DRINK BEER"
fi

相关内容