我在下面有一个Python脚本,它将在4个不同的主机上运行主机名,然后将其保存到文件中。然后它将打开该文件并将这些行或输出保存到程序稍后将使用的变量中。我手动运行它工作正常,虽然我每次使用cronjob时都会收到错误。
注意:如果您想知道如何通过以下方式连接到这些主机,整个脚本显然不在这里。但是剧本在我放在下面的部分失败了。
Python脚本:
#! /usr/bin/python
import os
hostname=['a','b','c','d']
for i in hostname:
os.system('hostname >> hostlist.txt')
data = open('hostlist.txt')
hosta, hostb, hostc, hostd = data.read().splitlines()
错误:
ValueError: too many values to unpack
Cronjob看起来像:
00 14 * * * python /tmp/hostname.py &> /tmp/hostnamerror.log
更新:::
好的,我很确定在更多故障排除后我知道了这个问题。似乎当我用Cronjob运行时它没有创建文件hostlist.txt,虽然如果我手动运行它然后它确实创建了这个文件。所以在Cronjob中它将hostlist.txt打开为一个没有变量的新文件,因此给出了错误消息。有没有人知道为什么运行Python脚本作为Cronjob会导致第一个os.system命令中的重定向不创建追加并创建文件?
答案 0 :(得分:0)
有趣而有趣。
您是否检查过文件hostlist.txt是否超过4个值?
脚本
我已经复制了您的脚本并在我的主机上运行时遇到了这个问题:
user@DESKTOP-RR909JI ~
$ python file.py
Traceback (most recent call last):
File "file.py", line 12, in <module>
hosta, hostb, hostc, hostd = data.read().splitlines()
ValueError: too many values to unpack
当文件超过4行时发生这种情况(因为你附加了&gt;&gt;该文件会一直增长)如果我的值少于4,我会收到错误:
ValueError: need more than 3 values to unpack
为了避免这个问题,我通过定义一些主机来修改你的脚本,验证文件不是空的,最后只读取我需要的行数,这是我定义的主机数。 / p>
#! /usr/bin/python
import os
#---- define the amount of hosts
hosts = 4
for i in range(0, hosts) :
os.system('hostname >> hostlist.txt')
#---- check if the file isn't empty
if os.stat("hostlist.txt").st_size == 0 :
print 'you need values in that file'
else :
with open("hostlist.txt") as myfile:
# only read lines up to the number of hosts
hosta, hostb, hostc, hostd = [next(myfile) for x in xrange(hosts)]
print 'this is variable hosta: ' +hosta
print 'this is variable hostb: ' +hostb
print 'this is variable hostc: ' +hostc
print 'this is variable hostd: ' +hostd
这是我的输出:
user@DESKTOP-RR909JI ~
$ python file.py
this is variable hosta: DESKTOP-RR909JI
this is variable hostb: DESKTOP-RR909JI
this is variable hostc: DESKTOP-RR909JI
this is variable hostd: DESKTOP-RR909JI
$ cat hostlist.txt
DESKTOP-RR909JI
DESKTOP-RR909JI
DESKTOP-RR909JI
DESKTOP-RR909JI
cron职位
您是否使用root来运行该任务?好像你是在/ etc / crontab *中添加作业而不是使用crontab -e,因为你没有定义用户。
它可能以某种方式与用户相关,尝试添加不同类型的crontab作业,指定用户如下:
crontab -u -e
这将打开指定用户的crontab(使用手动运行脚本时说的工作帐户)。
小心,crontab -e要求显式用户运行任务,而/ etc / crontab不这样就是为什么两个选项之间的列数不同。
答案 1 :(得分:0)
好的我明白了。出于某种原因,当我将它作为cronjob运行时,double direct没有创建文件,所以我先创建了文件然后运行命令,它现在似乎正在运行。感谢大家的投入!!