为什么当我使用 & 时我的 Python 脚本无法继续运行

为什么当我使用 & 时我的 Python 脚本无法继续运行

我的 gameServer.py 脚本通过 PuTTy 远程运行。

gameServer.py 如下所示:

而 True :
  (( 监听数据包 ))
  (( 将所有数据包发送给所有客户端 ))

当我正常执行脚本时:

./游戏服务器.py

它运行完美,但终端被绑定了。自然退出 PuTTy 会终止我的脚本。

我希望能够关闭PuTTY并让这个脚本永久运行,因此我尝试:

./gameServer.py &

但实际上不起作用我不明白为什么。首先,当以该&模式运行时,它不会接收或发送任何数据包,其次,每当我在控制台中输入回车键或任何内容时,它都会显示“+ 已停止”。

答案1

我不明白为什么它会停止,但尝试一下

nohup ./gameServer.py &

这应该会导致 gameServer.py 在断开 PuTTY 连接时忽略挂断信号

答案2

尝试使用以下命令将其置于后台:背景

user@rkt:~$ sleep 10
^z
[1]+  Stopped                 sleep 10
user@rkt:~$ bg
[1]+ sleep 10 &
user@rkt:~$ jobs
[1]+  Running                 sleep 10 &

答案3

你可以将您的进程更改为守护进程,然后你可以脱离你的 tty 而不被杀死:

def become_daemon():
  pid = os.fork ()
  if pid != 0: # if pid is not child...
    sys.exit(0)

  os.setsid() # Create new session and sets process group.
  pid = os.fork () # Will have INIT (pid 1) as parent process...
  if pid != 0: # if pid is not child...
    sys.exit(0)

并在您的脚本中简单调用此函数

你可以看看这个ActiveState 配方了解有关双叉机制建设和落实更加精准。

答案4

这并不是为了回答你的 Python 问题,不知道从哪里开始,但会调用一个临时的解决方法/有用的实用程序,screen yum install screen或者apt-get install screen如果你使用的是 Debian/Ubuntu 或 Redhat/Centos/Fedora,则会安装它。Screen 为你提供了一个 shell 会话,你可以从中断开连接并重新连接,而无需保持连接。我几乎在任何连接到的盒子上都使用它,因为如果我断开连接,我不会切断流程中可能造成破坏的工作。

只需运行screen即可生成一个新会话,运行您的命令,然后按 ctrl + a,然后按 d(按住两个字母的控制键)要重新连接,请screen -dr从命令行运行,您的屏幕会话将附加到您当前的连接。

相关内容