我是 Linux 新手,所以请原谅我的无知。
我正在尝试让 afile.sh
在 crontab 中运行,以便它每天在同一时间运行。当我在终端上运行脚本时,它运行良好。但它在 crontab 中不起作用。该文件如下所示:
echo 'password' | snx
python3 /home/absolute/path/to/script.py
snx -d
第一行连接到 VPN。第二行运行 Python 脚本(通过请求获取数据,然后将数据上传到数据库)。第三行断开与 VPN 的连接。
正如我所说,它在终端上运行时工作正常。但是当我运行crontab -e
并添加作业时:
* * * * * /home/absolute/path/to/file.sh
我知道它运行不正常(因为数据没有上传到数据库,所以 python 脚本肯定没有做它应该做的事情)。
我已经尝试过了:
- 我
file.sh
通过chmod
- 我检查了 cron 作业确实正在运行:为了验证这一点,我添加了几行将
file.sh
消息附加到文件debug.txt
。这些消息出现在 中debug.txt
,所以我知道它file.sh
已由 cron 运行。 - 我检查了一下,这不是环境变量的问题。我把两个都导出
PATH
到SHELL
crontab 和file.sh
。还是不行。 #!/bin/sh
在文件开头添加 shebang (和其他)。snx
使用绝对路径调用。
我认为这可能与 SNX 无法在 crontab 上运行有关。此问题指出了这种可能性:
https://stackoverflow.com/questions/54221762/automate-snx-restart-with-crontab
但我不确定如何使用这些信息(再次强调,我是 Linux 新手)。我尝试了那里提出的确切解决方案(即我在文件顶部添加了这些行),但仍然不起作用。
我还能尝试什么来让脚本在 cron 上运行?还有其他方法可以安排脚本定期运行吗?我觉得 cron 的行为与终端如此不同,这很奇怪。
答案1
将您的脚本更改为:
#!/bin/sh
echo 'password' | snx
python3 /home/absolute/path/to/script.py
snx -d
Linux 需要“shebang”来了解如何执行您的脚本。否则,内核就没有(万无一失的)方法知道您正在编写 Shell、Python、Perl 还是一系列其他语言。