Rscript 卡在对 python 的系统调用上
Rscript stuck on a system call to python
我的 Ubuntu 服务器后台有一个周期性脚本 运行。如果我在 RStudio 中执行它,一切都会按预期进行。但是当我使用 Rscript 通过终端执行时,它在调用 python 脚本时卡住了(它并不总是......但很多时候它卡在那里)。 (我知道它卡在那里,因为当我停止 Rscript 时,它总是告诉我这是 运行 我的 python 脚本)。我已经 chmod 777
进入那个 python 脚本,但没有任何线索。
这几天前一直正常工作,不知道为什么。
Rscript语句:
Rscript /home/XXX/XXX/scriptServicioBBDDHS.R
R代码中停止的地方:
outputMACs <- system(ignore.stdout = F, ignore.stderr = T,
"python3 /home/XXX/XXX/MACsPrincipal.py 'Y.Y.Y.Y' 'user' 'password'", intern = T)
python 脚本是 MikroTik 路由器的 API。尝试读取路由器的响应时卡住。在这句话中:
r = select.select([s, sys.stdin], [], [], None)
我把代码放在 python 脚本的 main()
中:
def main():
s = None
for res in socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except (socket.error, msg):
s = None
continue
try:
s.connect(sa)
except (socket.error, msg):
s.close()
s = None
continue
break
if s is None:
print ('could not open socket')
sys.exit(1)
apiros = ApiRos(s);
apiros.login(sys.argv[2], sys.argv[3]);
inputsentence = ['/ip/hotspot/active/print', '=detail=']
apiros.writeSentence(inputsentence)
t_end = time.time() + 2
while time.time() < t_end:
r = select.select([s, sys.stdin], [], [], None)
if s in r[0]:
# something to read in socket, read sentence
x = apiros.readSentence()
感谢您的帮助。当我第一次使用 crontab 时,这个脚本总是有效。现在它失败了。
塞尔吉奥。
我在 MikroTik API 中发现了一个可能的错误。问题出在句子
r = select.select([s, sys.stdin], [], [], None)
我不得不重写它以省略 sys.stdin
r = select.select(s, [], [], 0.0)
为此,我必须通过 R 使用以下参数进行系统调用:
system(ignore.stdout = F, ignore.stderr = T, "python3 /home/XXX/XXX/MACsPrincipal.py 'Y.Y.Y.Y' 'user' 'password'", intern = T)
如果您不忽略 stderr
输出,它将不起作用。
我的 Ubuntu 服务器后台有一个周期性脚本 运行。如果我在 RStudio 中执行它,一切都会按预期进行。但是当我使用 Rscript 通过终端执行时,它在调用 python 脚本时卡住了(它并不总是......但很多时候它卡在那里)。 (我知道它卡在那里,因为当我停止 Rscript 时,它总是告诉我这是 运行 我的 python 脚本)。我已经 chmod 777
进入那个 python 脚本,但没有任何线索。
这几天前一直正常工作,不知道为什么。
Rscript语句:
Rscript /home/XXX/XXX/scriptServicioBBDDHS.R
R代码中停止的地方:
outputMACs <- system(ignore.stdout = F, ignore.stderr = T,
"python3 /home/XXX/XXX/MACsPrincipal.py 'Y.Y.Y.Y' 'user' 'password'", intern = T)
python 脚本是 MikroTik 路由器的 API。尝试读取路由器的响应时卡住。在这句话中:
r = select.select([s, sys.stdin], [], [], None)
我把代码放在 python 脚本的 main()
中:
def main():
s = None
for res in socket.getaddrinfo(sys.argv[1], "8728", socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except (socket.error, msg):
s = None
continue
try:
s.connect(sa)
except (socket.error, msg):
s.close()
s = None
continue
break
if s is None:
print ('could not open socket')
sys.exit(1)
apiros = ApiRos(s);
apiros.login(sys.argv[2], sys.argv[3]);
inputsentence = ['/ip/hotspot/active/print', '=detail=']
apiros.writeSentence(inputsentence)
t_end = time.time() + 2
while time.time() < t_end:
r = select.select([s, sys.stdin], [], [], None)
if s in r[0]:
# something to read in socket, read sentence
x = apiros.readSentence()
感谢您的帮助。当我第一次使用 crontab 时,这个脚本总是有效。现在它失败了。
塞尔吉奥。
我在 MikroTik API 中发现了一个可能的错误。问题出在句子
r = select.select([s, sys.stdin], [], [], None)
我不得不重写它以省略 sys.stdin
r = select.select(s, [], [], 0.0)
为此,我必须通过 R 使用以下参数进行系统调用:
system(ignore.stdout = F, ignore.stderr = T, "python3 /home/XXX/XXX/MACsPrincipal.py 'Y.Y.Y.Y' 'user' 'password'", intern = T)
如果您不忽略 stderr
输出,它将不起作用。