我正在使用远程系统,我使用Pycharm远程窗口来编辑和运行我的脚本。
我登录使用
ssh -Y myName@myMachine
然后我从终端运行Pycharm。
我想以这样的方式从Pycharm运行我的脚本,如果我关闭它(甚至可能从ssh会话注销),进程仍然会运行。
我试图使用选项“分离而不终止进程”退出Pycharm。这导致python进程显示在以下列表中:
ps -all
但是,它会停止写入文件。当pycharm打开时,进程通常每隔几秒就写入一个文件。当从pycharm分离时,它会在进程列表中显示(在注销和再次登录之后它会在ps -x中显示未知的tty),但是它会停止工作,因为它不再将任何输出附加到它通常应该的文件。
可能导致什么呢?我怎样才能解决这个问题?
有几种方法:
tmux
和screen
:
tmux
- tmux是一个终端多路复用器,可以从一个屏幕创建,访问和控制多个终端。 tmux会话可以从屏幕上分离并继续在后台运行,然后重新连接。与屏幕工具类似,您也可以使用tmux从SSH会话中分离而不退出远程作业。
安装tmux后,使用以下命令启动tmux会话:
$ tmux
现在,开始你的任务或工作。然后通过按“CTRL-b”,然后按“d”,安全地从tmux会话中分离而不退出远程作业。这将分离你的tmux会话,但会让你在后台运行该会话。这意味着即使您与会话断开连接,所有遥控器也将运行。
要列出可用会话,请运行:
$ tmux ls
您可以使用相应的会话ID重新连接到tmux会话,如下所示:
$ tmux attach -t <会话ID>
有关更多详细信息,请参阅手册页。
$ man tmux
screen
- 屏幕工具,带有VT100 / ANSI终端仿真的全屏窗口管理器,允许您在不退出远程作业的情况下安全地从SSH会话中分离。对于使用多个远程服务器的人来说,它会很有帮助。
在远程系统上安装屏幕后,启动屏幕会话:
$ screen
屏幕会话现已开始。现在运行您想要在远程系统上执行的任何工作或任务,然后按“Ctrl-A”,然后按“d”退出屏幕会话,从屏幕会话中分离后,您可以从远程系统注销系统。远程作业将继续在服务器中运行。
要列出屏幕会话,请运行:
$ screen -ls
您可以使用相应的会话ID重新连接到屏幕会话,如下所示:
$ screen -r <会话ID>
有关更多详细信息,请参阅手册页。
$ man screennohup
- 代表No hangup,是另一个命令行实用程序,即使在您断开SSH会话后也可以帮助您运行Linux命令。
用法非常简单。登录远程系统后,您所要做的就是:
$ nohup <command>&
现在,您可以退出SSH会话。远程作业将继续运行。
要列出正在运行的作业,请运行:
$ jobs -l
有关更多详细信息,请参阅手册页。
$ man nohup
disown
- Disown,从系统的进程作业列表中删除作业,因此在会话断开连接时屏蔽进程不被杀死,因为当您注销时shell不会收到SIGHUP。
登录到远程系统后,使用“&”运行命令:
$ <command>&
然后列出正在运行的作业,使用:
$ jobs -l
然后使用进程ID运行disown,如下所示:
$ disown -h <PID>
您现在可以断开与服务器的连接
有关更多详细信息,请参阅手册页。
$ man nohup
setsid
- setsid为正在执行的进程分配一个新的进程组,因此,创建的进程完全在新分配的进程组中,并且可以安全地执行,而不用担心即使在会话注销后也被杀死。
登录远程系统后,运行:
$ setsid <command>
有关更多详细信息,请参阅手册页。
$ man nohup