我试图在后台运行一个sript:
nohup script.py > out 2> err < /dev/null &
脚本(Python 3.4
)在某个时候会:
(它有一个菜单在其中一个线程中运行)
nohup的电话崩溃了:
EOFError: EOF when reading a line
因为/dev/null
重定向stdin
我想。如果我在没有stdin
重定向的情况下运行它:
nohup script.py > out 2> err &
它会崩溃:
OSError: [Errno 9] Bad file descriptor
如果我使用:
script.py > out 2> err
它可以工作,但是阻塞了我的终端(它在前台)
如果我使用:
script.py > out 2> err &
它可以在后台运行,但只要input
调用到达,它就会停止。在
我想要的是:
stdout
和stderr
重定向到文件系统stdin
必须以某种方式启用)。stdout
和{stdin
是“冻结的”)基本上,我想要的是当它在后台时,stdin
有点“冻结”,每当它出现在前台时,它又能正常工作。在
这可能吗?解决方案不需要涉及nohup
您想要的(以及在python下
input
是如何工作并在EOF
上失败)的交互式菜单意味着您在调用程序时无法安全地将文件作为stdin
传递。这意味着您唯一的选择是这样调用:作为示范,这是我的脚本:
^{pr2}$本质上,它每秒钟都会写入
stdout
,每两秒钟它就会写入stderr
,最后,每隔10秒它就会等待输入。如果我运行这个程序并等待一秒钟(以允许磁盘刷新),然后将其链接在一起,如下所示:请至少等待10秒,然后再次尝试
cat out err
:请注意,
input
生成的提示也被写入stdout,程序有效地继续运行到它期望stdin
给它数据的地方。您只需通过%
将进程恢复到前台,并开始向它提供所需的数据,然后使用^Z
(CtrlZ)暂停,并使用%&
在后台继续运行。示例:再次等待10秒后,
cat out
:这实际上是一个基本的速成课程,教你如何在前台和后台运行标准进程,如果代码正确地处理标准IO,事情就会如预期的那样工作。在
最后,你不可能真的同时拥有。如果应用程序需要stdin而没有提供,那么clear选项是failure。但,若提供了一个应用程序,但应用程序被发送到后台并继续运行,则它将是}时不会导致错误。如果您想让}为空时,它将阻塞(导致进程停止)。在
Stopped
,因为它期望进一步的输入。如果这个停止的行为是不需要的,那么应用程序就是有问题的,那么除了更改应用程序使其在以/dev/null
作为其stdin
执行时遇到{stdin
保持原样,那么当应用程序在后台时,它能够以某种方式保持运行,那么就不能使用input
函数,因为当{既然您已经通过下面的注释澄清了您的“交互式提示”是在一个线程中运行的,并且由于} 或^{} 会话中执行此操作,因为它们完全实现了一个伪tty,它独立于启动的任何控制台(因此您可以断开连接并将会话发送到后台,或启动其他虚拟会话,请参阅手册页),这将提供程序所需的stdio。在
input
的用法直接从stdin
读取,而且您似乎不愿意修改您的程序(您要求的是一般情况),但希望一个实用程序为您完成这项工作,简单的解决方案是在^{最后,如果您真的希望您的应用程序本机支持这一点,您不能简单地按原样使用} ),或者通过检查进程当前是在前台还是后台(您可以从How to detect if python script is being run as a background process开始工作)您可能希望使用
input
,但是您应该检查是否可以安全地调用input
(例如,可能使用^{sys.stdin
进行检查,以确定是否可以安全地调用input
(但是,如果用户在输入时挂起任务,它仍将挂起为input
等待),或者使用unix套接字进行通信。在相关问题 更多 >
编程相关推荐