如何将Pycharm中的Python脚本独立运行以继续附加文件?

9 投票
1 回答
5815 浏览
提问于 2025-04-18 02:52

我正在使用一个远程系统,并且我用Pycharm的远程窗口来编辑和运行我的脚本。

我通过以下方式登录:

ssh -Y myName@myMachine

然后我从终端启动Pycharm。

我希望能从Pycharm运行我的脚本,这样即使我关闭Pycharm(甚至可能注销ssh会话),这些进程仍然可以继续运行。

我尝试过使用“分离而不终止进程”的选项退出Pycharm。这样做后,Python进程会出现在以下列表中:

ps -all

但是,它停止向文件写入内容。当Pycharm打开时,进程通常每隔几秒就会向文件写入一次内容。当从Pycharm分离后,它仍然在进程列表中显示(注销后再登录时,它在ps -x中显示为unknown tty),但它停止工作,也就是说,它不再向应该写入的文件追加任何输出。

这可能是什么原因呢?我该如何解决这个问题?

1 个回答

4

有几种方法可以做到这一点:

  1. 使用终端模拟器,比如 tmuxscreen

    1. tmux - tmux 是一个终端复用器,可以让你在一个屏幕上创建、访问和控制多个终端。你可以把 tmux 会话从屏幕上分离出来,继续在后台运行,然后再重新连接。就像 Screen 工具一样,你也可以用 tmux 从 SSH 会话中分离,而不退出远程任务。

      安装 tmux 后,使用以下命令开始 tmux 会话:

      $ tmux

      现在,开始你的任务或工作。然后按 "CTRL-b" 再按 "d" 安全地从 tmux 会话中分离,而不退出远程任务。这将使你的 tmux 会话分离,但会话中的所有操作仍在后台运行。这意味着即使你断开了会话,所有远程任务也会继续运行。

      要列出可用的会话,可以运行:

      $ tmux ls

      你可以使用相应的会话 ID 重新连接到 tmux 会话,如下所示:

      $ tmux attach -t < session ID >

      更多详细信息,请参考手册。

      $ man tmux

    2. screen - screen 工具是一个全屏窗口管理器,支持 VT100/ANSI 终端仿真,允许你安全地从 SSH 会话中分离,而不退出远程任务。这对那些在多个远程服务器上工作的人非常有帮助。

      在你的远程系统上安装 screen 后,开始 screen 会话:

      $ screen

      现在 screen 会话已经开始。接下来运行你想在远程系统上执行的任务,然后按 “Ctrl-A” 再按 “d” 从 screen 会话中分离。分离后,你可以注销远程系统,远程任务会继续在服务器上运行。

      要列出 screen 会话,可以运行:

      $ screen -ls

      你可以使用相应的会话 ID 重新连接到 screen 会话,如下所示:

      $ screen -r < session ID >

      更多详细信息,请参考手册。

      $ man screen

  2. 使用在后台执行的分离命令:

    1. nohup - 代表No hangup,是另一个命令行工具,可以帮助你在断开 SSH 会话后继续运行 Linux 命令。

      使用非常简单。在登录到远程系统后,你只需:

      $ nohup < command > &

      现在,你可以退出 SSH 会话,远程任务会继续运行。

      要列出正在运行的任务,可以运行:

      $ jobs -l

      更多详细信息,请参考手册。

      $ man nohup

    2. disown - disown 命令可以将任务从系统的进程列表中移除,这样在会话断开时,该进程就不会被杀掉,因为它在你注销时不会收到 SIGHUP 信号。

      在登录到远程系统后,运行你的命令时加上 "&"

      $ < command > &

      然后使用以下命令列出正在运行的任务:

      $ jobs -l

      接着使用进程 ID 运行 disown,如下所示:

      $ disown -h < PID >

      现在你可以断开与服务器的连接了。

      更多详细信息,请参考手册。

      $ man nohup

    3. setsid - setsid 会为正在执行的进程分配一个新的进程组,因此创建的进程完全在新分配的进程组中,可以安全执行,即使在会话注销后也不会被杀掉。

      在登录到远程系统后,运行:

      $ setsid < command >

      更多详细信息,请参考手册。

      $ man nohup

撰写回答