我在远程系统上工作,我使用 Pycharm 远程窗口来编辑和运行我的脚本。
我登录使用
ssh -Y myName@myMachine
然后我从终端运行 Pycharm。
我想以这种方式从 Pycharm 运行我的脚本,如果我关闭它(甚至可能从 ssh session 注销),进程仍将运行。
我尝试使用选项“分离而不终止进程”退出 Pycharm。这导致 python 进程显示在列表中:
ps -all
但是,它会停止写入文件。当 pycharm 打开时,进程通常每隔几秒写入一个文件。当从 pycharm 分离时,它显示在进程列表中(注销并再次登录后,它显示在 ps -x with unknown tty 中),但是它停止工作,因为它不再将任何输出附加到它通常应该附加的文件。
可能是什么原因造成的?我该如何解决这个问题?
最佳答案
有几种方法:
将终端模拟器用作
tmux
和screen
: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
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
使用在后台执行的分离命令([另请阅读][6]):
nohup
- 代表 No hangup,是另一个命令行实用程序,可帮助您运行 Linux 命令,即使在您已与 SSH session 断开连接。使用非常简单。登录到您的远程系统后,您所要做的就是:
$ nohup < command > &
现在,您可以退出 SSH session 。远程作业将继续运行。
要列出正在运行的作业,请运行:
$ jobs -l
有关详细信息,请参阅手册页。
$ man nohup
disown
- Disown,从系统的进程作业列表中删除作业,因此进程在 session 断开期间不会被杀死,因为它不会收到 shell 的 SIGHUP当您注销时。登录到您的远程系统后,使用"&"运行您的命令:
$ < command > &
然后列出正在运行的作业,使用:
$ jobs -l
然后使用进程 ID 运行 disown,如下所示:
$ disown -h < PID >
您现在可以断开与服务器的连接
有关详细信息,请参阅手册页。
$ man nohup
setsid
- setsid 为正在执行的进程分配一个新的进程组,因此,创建的进程完全在一个新分配的进程组中,可以安全地执行,甚至不用担心被杀死 session 注销后。登录到远程系统后,运行:
$ setsid < command >
有关详细信息,请参阅手册页。
$ man nohup
关于python - 如何分离从 Pycharm 运行的 python 脚本,以便它不断附加到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23093971/