基本上我想在后台启动一个守护进程,它仍然会在控制台中提示用户输入密码。我用pexpect创建了这个,但是当这个程序结束时它会杀死守护进程,因为它是一个子进程。因此,显然pexpect不适用于此。有没有人知道这样做的方法?
#!/usr/bin/env python
import pexpect
import getpass
child = pexpect.spawn('python daemon.py &')
child.expect_exact('Password:')
passwd = getpass.getpass()
child.sendline(passwd)
index = child.expect_exact('Started Successfully')
print index
答案 0 :(得分:3)
pexpect有一个方法close(self, force=True),它关闭了与子进程的连接。
根据文档,如果force = True则终止子进程
child.close(force=False)
应该断开连接,但让应用程序继续运行。
答案 1 :(得分:1)
Dany建议,“你考虑过使用os.fork()然后运行守护进程模块吗?”
您的回答是“是的,但我不知道如何将密码传递给守护进程。必须保持密码安全,即不要存储在硬盘上而不是在屏幕上显示。”
但您无需执行任何操作即可将密码传递给守护程序。在fork之后,它仍然可以访问。例如:
passwd = getpass.getpass()
pid = os.fork()
if pid:
print 'Parent thinks passwd is', passwd
else:
print 'Child thinks passwd is', passwd
所以,在父节点中读取密码,然后分叉守护进程;它已经有密码,所以它不需要任何东西。问题解决了。