当我收到“有已停止的作业”错误时我该怎么办?

当我收到“有已停止的作业”错误时我该怎么办?

我多次遇到过这种情况。

例如,每当我尝试使用以下命令emacssudo权限打开某个文件时:

sudo emacs tet.c &

Ubuntu 不会要求我输入密码,而是直接启动emacs进程,不会出现任何emacs窗口,也不会在终端上输出任何内容(除了 pid),请看下图(如果我不使用“&”,它会要求我输入密码):

在此处输入图片描述

我有两个与此相关的问题:

  1. 当我收到“有已停止的作业”错误时,我该怎么办?我如何识别所有此类已停止的作业并终止它们?一旦我清除终端,我将不会有这些已停止进程的 pid。

  2. 为什么 Ubuntu/emacs 会出现这种情况?为什么它不要求我输入密码?

答案1

There are stopped jobs消息是很远很远是一个错误。这只是一个通知,告诉您您试图退出 shell,但您有一个或多个暂停的作业/程序(在您的情况下,emacs您在命令末尾使用它们置于后台&)。除非您有意,否则系统不允许您退出 shell 并终止作业。您可以做几件事来响应此消息:

  • 使用jobs命令来告诉你已暂停哪些作业
  • fg您可以选择使用命令在前台添加作业
  • 如果您不关心作业是否终止,您只需exit再次输入;exit第二次输入(无论是否有中间jobs命令)都将导致所有暂停的作业终止。

要回答第二个问题,我会告诉你,Ubuntu 或 emacs 不会出现这种情况。当你让应用程序在后台运行时,这是一种正常行为。在这种情况下,它sudo要求输入密码,但在后台询问,所以你看不到这个事实。要看到它,你应该使用fg命令将作业带回前台:

radu@Radu: ~ $ sudo emacs tet.c &
[1] 7732
radu@Radu: ~ $ # now sudo emacs run in background so you can't see nothing about what's happening
radu@Radu: ~ $ fg
[sudo] password for radu:

此后,您可以输入Ctrl+Z以再次将作业置于后台(如果您愿意)。然后,您可以再次运行“fg”命令以将作业带回前台,依此类推。

答案2

您收到消息,因为系统警告您有关当前 shell 相关的活动作业。

您可以通过运行以下命令列出这些正在运行/已停止的作业:jobs

然后您可以执行以下操作之一:

  • 将最后一项工作移至前台,方法如下:(与后台fg相反bg),
  • 运行disown以从当前 shell 中删除这些作业而不终止它们,
  • 通过按Ctrl+D两次来终止这些任务来强制注销,就像输入两次exit/一样logout
  • 通过运行手动终止这些作业:(kill $(jobs -p)添加-9强制)
  • 如果您不拥有它们,但仍想终止所有停止的进程,请尝试:

    kill $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')


回答有关的问题sudo,它不会要求您输入密码,因为它需要有活动的终端才能从中接收密码标准输入,并且通过在后台运行它,shell 不会等待命令完成,因此您无法与该命令进行交互。

在这种情况下,您有 3 种可能性:

  • 运行命令而不进入后台(&),
  • 从标准输入而不是终端设备读取密码,sudo -S例如

    echo mypass | sudo emacs tet.c
    
  • 通过以下命令配置 sudo 不要求输入密码:visudo命令并编辑sudoers文件。请参阅:NOPASSWD为用户启用

答案3

当你遇到有作业已停止错误:

  1. 输入jobs--> 你将看到处于停止状态的作业
  2. 然后输入exit-->你就可以退出终端

相关内容