如何在 Unix Shell 中结束程序?

如何在 Unix Shell 中结束程序?

可能重复:
当 ctrl-c 无法终止进程时该怎么办?

在笔记本电脑上,我按下笔记本电脑功能键 + break。在台式机上,我的 break 键(位于打印屏幕旁边)如下所示:

Pause
Break

如果我按下它(没有 Ctrl/Alt/等),我会得到这个(忽略回声,它们只是在那里,这样我才能弄清楚是什么):

# sleep 10;echo "no ctrl/alt/shift/etc"

[12]+  Stopped                 sleep 10

如果我按下 Shift 键,则会得到以下结果:

[root@ID6052 public_html]# sleep 10;echo "shift + pause/break"

[13]+  Stopped                 sleep 10

如果我按下 Ctrl 键,什么也不会发生。

如果我使用 Alt 按下暂停/中断键,则会得到以下结果:

[root@ID6052 public_html]# sleep 10;echo "alt + pause/break"

[15]+  Stopped                 sleep 10

我如何让它停止程序?如果我获得正在运行的进程列表,所有这些“[xx]+ Stopped...”命令都会显示出来(处于停止状态)。在我的笔记本电脑上,按下 func+break(即,只是普通的 break 键...func 按钮也用于滚动锁定、打印屏幕等)会完全关闭程序!

答案1

通常,unix shell 有以下键映射

control-C => SIGINT (中断)
control-Z => SIGTSTP (终端停止/暂停)

有时还有
control-y => 延迟停止(不确定如何实现)

Control-C 将通常中断并终止程序。但 SIGINT 可以被程序处理和忽略或处理。

Control-Z 将通常暂停(停止)你的程序。但是 SIGSTSP 也可以被程序处理和忽略或处理,尽管在实践中这种情况似乎比处理 SIGINT 要少见。

发送 SIGSTOP(kill -STOP从另一个终端)将暂停(停止)您的程序并且无法处理。

看起来导致程序“停止”的组合键可能相当于 Control-Z。

如果您让进程处于停止状态,您的 shell 会报告作业编号。看起来您可能正在使用 bash。无论如何,大多数 shell 都会让您使用作业编号来控制已停止或后台的作业。

kill -KILL %1
kill -9 %1
bg %1
fg %1

依此类推,分别杀死、杀死、置于后台或置于前台你的(第一个)工作。

您可以使用命令

jobs

列出当前与您所在的 shell 关联的作业。嗯,取决于它是哪个 shell,您没有指定。

答案2

尝试: control-C

答案3

您可以使用Ctrl-C在终端中结束程序的执行。

您可以使用以下命令终止已停止的程序kill

kill PID

进程 ID 在哪里PID(您将在输出中看到的数字ps):

[约翰@awesome]$python
Python 2.4.3(#1,2008 年 9 月 17 日,16:04:01)
Linux 上的 [GCC 4.1.2 20071124 (Red Hat 4.1.2-41)]
输入“帮助”、“版权”、“信用”或“许可”以获取更多信息。
>>>
[1]+ 已停止 Python
[约翰@awesome]$ps
  PID TTY 时间命令
 3560 分/1 00:00:00 猛击
 3588 分/1 00:00:00 python
 3609 分/1 00:00:00 分

不使用kill任何开关与使用 相同-TERM。它将尝试正常关闭程序。如果它仍然没有响应,您可以kill使用 强制关闭它kill -9,但不建议这样做,因为它可能会留下打开的缓冲区的文件。

答案4

从 Unix 终端中断正在运行的程序主要有两种方法:

  1. Ctrl-c将发送一个 INT(中断)信号,默认情况下这将使程序退出,但有些程序会覆盖这一点。
  2. Ctrl-\将发送一个 QUIT 信号,这通常会导致程序停止运行,但通常不会干净地退出。

如果这些不起作用,请使用Ctrl-z键暂停程序(或切换到另一个终端),然后使用命令向程序kill发送TERMKILL信号(按此顺序)。后者将总是当程序下次有机会运行时终止程序(这并不总是立即运行,例如如果它正在从网络文件中读取)。

相关内容