python - 如何分离从 Pycharm 运行的 python 脚本,以便它不断附加到文件?

标签 python ssh process pycharm nohup

我在远程系统上工作,我使用 Pycharm 远程窗口来编辑和运行我的脚本。

我登录使用

ssh -Y myName@myMachine

然后我从终端运行 Pycharm。

我想以这种方式从 Pycharm 运行我的脚本,如果我关闭它(甚至可能从 ssh session 注销),进程仍将运行。

我尝试使用选项“分离而不终止进程”退出 Pycharm。这导致 python 进程显示在列表中:

ps -all

但是,它会停止写入文件。当 pycharm 打开时,进程通常每隔几秒写入一个文件。当从 pycharm 分离时,它显示在进程列表中(注销并再次登录后,它显示在 ps -x with unknown tty 中),但是它停止工作,因为它不再将任何输出附加到它通常应该附加的文件。

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

最佳答案

有几种方法:

  1. 将终端模拟器用作 tmuxscreen:

    1. tmux - tmux 是一个终端多路复用器,可以从单个屏幕创建、访问和控制多个终端。 tmux session 可以从屏幕上分离并继续在后台运行,然后重新附加。与 Screen 工具一样,您也可以使用 tmux 从 SSH session 中分离而无需退出远程作业。

      安装 tmux 后,使用命令启动 tmux session :

      $ tmux

      现在,开始您的任务或工作。然后通过按 "CTRL-b" 然后按 "d" 安全地脱离 tmux session 而不退出远程作业。这将分离您的 tmux session ,但会让您在后台运行的 session 中进行操作。这意味着即使您与 session 断开连接,所有 Remote 也会运行。

      要列出可用的 session ,请运行:

      $ tmux ls

      您可以使用相应的 session ID 重新附加到 tmux session ,如下所示:

      $ tmux attach -t < session ID >

      有关详细信息,请参阅手册页。

      $ man tmux

    2. screen - screen 工具是一个带有 VT100/ANSI 终端仿真的全屏窗口管理器,允许您安全地脱离 SSH session 而无需退出远程作业。这对那些使用多个远程服务器的人很有帮助。

      在远程系统上安装屏幕后,启动屏幕 session :

      $ screen

      现在屏幕 session 已经开始。现在在远程系统上运行您想执行的任何工作或任务,然后您可以通过按 “Ctrl-A” 然后按 “d“ 退出屏幕 session ,从屏幕 session 分离后,您可以从远程系统注销。远程作业将继续在服务器中运行。

      要列出屏幕 session ,请运行:

      $ screen -ls

      您可以使用相应的 session ID 重新附加到屏幕 session ,如下所示:

      $ screen -r < session ID >

      有关详细信息,请参阅手册页。

      $ man screen

  2. 使用在后台执行的分离命令([另请阅读][6]):

    1. nohup - 代表 No hangup,是另一个命令行实用程序,可帮助您运行 Linux 命令,即使在您已与 SSH session 断开连接。

      使用非常简单。登录到您的远程系统后,您所要做的就是:

      $ nohup < command > &

      现在,您可以退出 SSH session 。远程作业将继续运行。

      要列出正在运行的作业,请运行:

      $ jobs -l

      有关详细信息,请参阅手册页。

      $ man nohup

    2. disown - Disown,从系统的进程作业列表中删除作业,因此进程在 session 断开期间不会被杀死,因为它不会收到 shell 的 SIGHUP当您注销时。

      登录到您的远程系统后,使用"&"运行您的命令:

      $ < command > &

      然后列出正在运行的作业,使用:

      $ jobs -l

      然后使用进程 ID 运行 disown,如下所示:

      $ disown -h < PID >

      您现在可以断开与服务器的连接

      有关详细信息,请参阅手册页。

      $ man nohup

    3. setsid - setsid 为正在执行的进程分配一个新的进程组,因此,创建的进程完全在一个新分配的进程组中,可以安全地执行,甚至不用担心被杀死 session 注销后。

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

      $ setsid < command >

      有关详细信息,请参阅手册页。

      $ man nohup

关于python - 如何分离从 Pycharm 运行的 python 脚本,以便它不断附加到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23093971/

相关文章:

jquery - 在 Django : Problems with loading jquery with multiple plugins - or: How to load jQuery only once?

ssh - Windows 7 上的 VirtualBox 端口转发不起作用

c# - Process Stream类不支持写

c# - 何时使用 Process.EnterDebugMode

c - parent 应该收到有关孙子工作完成的信息

python - 自删除实例

使用 from package import module 语法时 Python 循环导入失败

python - 在 RHEL 7 虚拟机上安装 psycopg2 时出现 gcc 错误

python - 我可以手动 ssh,但不能通过脚本 - 权限被拒绝(公钥)

Python ssh 连接到交互式程序(例如,python 解释器)