Shell 脚本不与 Cron 一起运行,而是手动运行

Shell 脚本不与 Cron 一起运行,而是手动运行

我觉得我已经尝试了一切,我在谷歌上的搜索历史记录大约有 20 页,试图解决这个问题,但没有任何效果。基本上我有一个脚本来检查我的 tun0 接口是否存在,如果丢失,计算机将重新启动。这是代码:

#!/bin/bash
. /etc/profile
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
if echo `ifconfig` | grep -q "tun0"
then echo ""
else
    reboot
fi

如果我使用其路径在终端上调用它,则脚本本身运行良好:

/scripts/vpnrestart1.sh

我已将其添加到 crontab -e 的顶部:

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

我的 cron 任务如下所示:

* * * * * /scripts/vpnrestart1.sh

脚本本身的权限都很好,并且可以在不使用 sudo 的情况下执行。正如我所提到的,它从终端运行得很好并且按照设计工作。但如果我将其放入 cron 并删除 tun0 接口,则什么也不会发生。

答案1

您是否尝试过调试脚本以查看执行时会发生什么cron?将以下代码插入到您的脚本中:

# log stdout and stderr to two different files
exec >>/var/log/looog.log 2>>/var/log/looog.err.log

# ...and log every command we try to execute to stderr (aka looog.err.log)
set -x

执行脚本后,将生成这两个文件,您将能够看到发生了什么。

答案2

如果reboot您登录后可以直接以非 root 用户身份运行,这是因为您的系统配置为允许物理登录的用户重新启动系统。这可以通过波尔基特

从 crontab 来看,您并未处于登录会话中。重新启动系统的 cron 作业必须以 root 身份运行。

我不认为重新启动是创建网络接口的解决方案。只需拨打您通常所做的任何电话即可启动 VPN。而且您可能需要成为 root 才能执行此操作(您需要成为 root 才能设置网络接口,因此vpnrestart1.sh必须以 root 身份运行,或者通过 setuid 程序(例如关键部分的 sudo)获得 root 权限,或者它委托给 NetworkManager,后者可能使用 Polkit 来允许某些用户会话影响系统配置)。

答案3

在 shell 脚本中使用完整路径而不是相对路径。这解决了我的问题。

相关内容