我想安排一个 cron 作业在启动期间运行服务器客户端应用程序。我所做的是crontab -e
,然后输入以下行@reboot cd path/to/folder && /usr/bin/sh /home/Folder1/execute.sh
。文件的内容execute.sh
如下:
. ./venv/bin/activate
python main.py
该文件夹包含sh
文件main.py
和.env
存储的文件NETWORK_MODE
。 cron 作业确实在启动时启动。 但是,我在main.py
获取 ip 的以下几行中遇到了 netifaces 模块错误。
import netifaces as ni
ip = ni.ifaddresses(os.environ.get("NETWORK_MODE", "eth0"))[ni.AF_INET][0]['addr']
我认为错误keyError:2
可能是它在互联网打开之前执行,在这种情况下,我将 crontab 条目更改为
@reboot sleep 120 && cd path/to/folder && /usr/bin/sh /home/Folder1/execute.sh
错误仍然存在。可能是什么问题?
答案1
该错误与无关cron
。
假设python3
:
import os
您也需要这样做:
import os
import netifaces as ni
ip = ni.ifaddresses(os.environ.get("NETWORK_MODE", "eth0"))[ni.AF_INET][0]['addr']
作为造型说明PEP 8将一行代码的最大长度设置为 79 个字符...因此,为了遵守该规定,我建议:
import os
import netifaces as ni
oi = os.environ.get("NETWORK_MODE", "eth0")
ip = ni.ifaddresses(oi)[ni.AF_INET][0]['addr']
但是,你不需要所有这些......你需要的是:
import netifaces as ni
ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr']
并确保您指定了有效的接口名称。
错误本身:
KeyError: 2
但是,这意味着您试图访问2
不包含该键的字典中的键...尝试以下示例:
my_dict = {1: ['a', 'b'], 3: ['e', 'f']}
print(my_dict[2])
这将导致KeyError: 2
,因为您试图访问2
不包含该键的字典中的键。
在您的情况下,这意味着您的接口没有分配 IP4 地址,即未连接...在接口连接时ni.ifaddresses('eth0')[ni.AF_INET]
将具有一个键值2
...即,如果接口已连接,则第二个键将包含 IP4,但是,如果接口未连接,则不会有 IP4 条目/项,也没有2
键...因此您会收到错误消息...查看eth0
连接时以下代码打印的内容,然后断开连接并再次运行代码以比较输出以了解:
import netifaces as ni
eth0 = ni.ifaddresses('eth0')
print(eth0)