【问题标题】:How do I detach python script run from Pycharm so it keeps appending to files?如何分离从 Pycharm 运行的 python 脚本,以便它继续附加到文件?
【发布时间】:2014-05-30 09:54:20
【问题描述】:

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

我使用

登录
ssh -Y myName@myMachine

然后我从终端运行 Pycharm。

我想以这样的方式从 Pycharm 运行我的脚本,如果我关闭它(甚至可能从 ssh 会话中注销),这些进程仍然会运行。

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

ps -all

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

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

【问题讨论】:

  • 您是否尝试过直接在 PyCharm 之外运行您的脚本?使用python myscript.py 命令?也许一旦在 IDE 中编写了所有脚本,您就可以直接从命令提示符启动脚本并让它执行您想要的操作?或者您可以使用 cx_freeze 或 pyinstaller 部署应用程序,然后将应用程序与 PyCharm 分开运行,对吗?
  • 嗨@natalia-zoń 如果这个或任何答案已经解决了您的问题,请点击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。
  • 你好 Yogev,谢谢。我知道您希望提高自己的声誉,但我不接受您的回答是有原因的。 5年前我问过这个问题。我什至不记得为什么我首先需要这个解决方案,我不再在那个代码库、公司甚至同一个国家工作。我绝对没有办法检查您一个月前发布的答案是否会解决它 - 除非我再次遇到这个问题,否则我不会检查它,因为我什至没有在这一点上工作不再是python了。

标签: python ssh process pycharm nohup


【解决方案1】:

有几种方法:

  1. 使用终端模拟器作为tmuxscreen

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

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

      $tmux

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

      要列出可用会话,请运行:

      $ tmux ls

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

      $ tmux attach -t

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

      $ man tmux

    2. screen - screen 工具,一个带有 VT100/ANSI 终端仿真的全屏窗口管理器,允许您在不退出远程作业的情况下安全地从 SSH 会话中分离。这对使用多个远程服务器的人会有所帮助。

      在远程系统上安装 screen 后,启动 screen 会话:

      $屏幕

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

      要列出屏幕会话,请运行:

      $屏幕-ls

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

      $ screen -r

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

      $ 人屏

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

    1. nohup - 代表 No hangup,它是另一个命令行实用程序,可帮助您在与 SSH 会话断开连接后运行 Linux 命令.

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

      $ nohup &

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

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

      $ 工作 -l

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

      $ man nohup

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

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

      $ &

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

      $ 工作 -l

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

      $ disown -h

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

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

      $ man nohup

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

      登录远程系统后,运行:

      $setsid

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

      $ man nohup

【讨论】:

    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2020-01-17
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多