例如,
#!/bin/bash
while :
do
sl
done
如何终止这个 bash 脚本?
答案1
- 按
Ctrl-Z
暂停脚本 kill %%
告诉%%
bash 内置函数kill
您想要将信号(默认为 SIGTERM)发送到当前 shell 中最近挂起的后台作业,而不是进程 ID。
您还可以按编号或名称指定作业。例如,当您使用 ^Z 暂停作业时,bash 会使用类似 的内容告诉您其作业编号[n]+ Stopped
,其中方n
括号内是作业编号。
有关作业控制和终止作业的更多信息,请在 bash 中运行help jobs
、help fg
、help bg
和help kill
,然后搜索JOB CONTROL
(全部大写)或jobspec
在 bash 手册页中。
例如
$ ./killme.sh ./killme.sh:第 4 行:sl:找不到命令 ./killme.sh:第 4 行:sl:找不到命令 ./killme.sh:第 4 行:sl:找不到命令 ./killme.sh:第 4 行:sl:找不到命令 ./killme.sh:第 4 行:sl:找不到命令 ... ... ... ./killme.sh:第 4 行:sl:找不到命令 ^Z [1]+ 已停止./killme.sh $杀死%% $ [1]+ 终止./killme.sh
在此示例中,作业编号为 1,因此其kill %1
工作方式与kill %%
(注意:我没有sl
安装,所以输出只是“未找到命令”。在您的情况下,您将得到 sl 产生的任何输出。这并不重要 - 挂起^Z
和kill %%
将工作相同)
答案2
该程序sl
故意忽略SIGINT
,这是当您按 时发送的内容Ctrl+C。因此,首先,您需要通过添加参数来告诉sl
不要忽略。SIGINT
-e
如果你尝试这样做,你会发现你可以阻止每个人sl
,但他们仍然重复。您还需要告诉bash
退出之后。SIGINT
您可以通过trap "exit" INT
在循环之前放置 a 来完成此操作。
#!/bin/bash
trap "exit" INT
while :
do
sl -e
done
答案3
如果您希望 ctrl+c 停止循环,但不终止脚本,您可以将其放在|| break
正在运行的任何命令之后。只要您运行的程序通过 ctrl+c 终止,就可以正常工作。
#!/bin/bash
while :
do
# ctrl+c terminates sl, but not the shell script
sl -e || break
done
如果您处于嵌套循环中,则可以使用“break 2”退出两层,等等。
答案4
您可以通过从启动此脚本的终端按 Ctrl+C 来终止该脚本。当然,此脚本必须在前台运行,以便您可以通过 Ctrl+C 停止它。
或者您可以通过以下方式在其他打开的终端中找到该脚本的 PID(进程 ID):
ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>
两种方法都应该能够满足您的要求。