作业控制和 ssh

作业控制和 ssh

我似乎想不出一个通过 ssh 管理作业的得体方法。我想在 ssh 会话中启动一项作业,注销,重新登录,执行 fg,检查作业,注销,然后重复整个过程。nohup 似乎不太好用。

我用了这个命令

 $ nohup script & > nohup.out 
 [1] 28128
 $ nohup: ignoring input and appending output to `nohup.out'
 [1]+  Exit 255                nohup script

如果我做

$ jobs
$ ps -ef |  grep script

我什么也没得到,即没有找到该进程。

另外,我有一个相关的问题:如果我在 ssh 会话中,并且想要将作业发送到后台,ctrl-z 不起作用。该怎么办?

有人能帮助我吗?

答案1

嗯——其中一个选择是使用屏幕

  1. 你登录
  2. 你火起来屏幕
  3. 你做你的工作
  4. 按 ctrl+ad 即可分离
  5. 你退出
  6. 几个小时后,您登录 arain 并运行屏幕-r- 你的 shell / 作业结果就在你面前。或者它仍然在运行......

更多示例这里

另一个 - 如果是一次性工作的话可能会更糟 - 选项是妖魔化你的 shell 脚本,添加适当的日志记录并使用 start-stop-daemon 在后台运行它直到它完成。状态 - 可以在生成的日志中进行检查。

答案2

我也使用屏幕来实现这一点..通常我登录并运行

screen -S $meaningful-name

然后当我重新连接时我只需运行

screen -r $meaningful-name

如果我在我们的一台服务器上以 root 身份运行,我通常也会将我的用户名放在屏幕会话名称中,以便其他人可以看到它并在需要时连接到它。

答案3

你可以使用程序screen。我用它来管理几个交互式 shell 程序。

用法:

screen
startyoujob.sh
<C-A D> (Ctrl A then D, will detach your session)
screen -r (this will reattach your session)

screen以下是一些建议Arch Linux 维基, 这官方screen网站, 还有一些有关您的 screenrc 的提示和技巧(带有屏幕截图)。

答案4

如果您不想使用 screen,唯一的其他选择是将所有输出发送到日志文件,然后在日志文件上运行 tail 以查看进度。这假设该作业不是交互式的,对于任何长时间运行的作业来说,情况可能都是如此。如果您需要提前停止该作业,可以使用 ps 找到 pid 并将其终止。

查看上面的命令,您应该能够检查 nohup.out 的内容。但是,Nohup 不是必需的,您可以启动作业,运行 ^Z,然后键入“disown”(无论如何在 bash 中 - 这会从作业列表中删除作业,但没有办法解决这个问题)。

相关内容