在Linux操作系统中,jobs指的是通过终端启动的后台任务或挂起的任务,这些任务通常由bash等shell管理,用户可以通过&将任务置于后台运行,或通过Ctrl+Z将前台任务挂起(暂停)并转为后台任务,随着任务执行完毕或不再需要,及时删除无用jobs可以避免系统资源浪费,提升终端操作效率,本文将详细介绍Linux中删除jobs的多种方法、适用场景及注意事项。

查看当前终端的jobs信息
在删除jobs之前,首先需要明确当前终端有哪些正在运行或挂起的jobs,Linux提供了jobs命令用于查看后台任务列表,其常用选项及作用如下表所示:
| 选项 | 作用 | 示例输出 |
|---|---|---|
| 无选项 | 列出当前终端的所有jobs,显示jobid、状态、命令 | [1] + running sleep 100 & |
-l |
显示jobs的PID(进程ID) | [1] + 12345 running sleep 100 & |
-p |
仅显示jobs的PID,不显示其他信息 | 12345 |
-r |
仅显示正在运行的jobs(Running) | [1] + running sleep 100 & |
-s |
仅显示已停止的jobs(Stopped) | [2] - suspended vim test.txt |
执行jobs命令后,每行输出开头会显示jobid(如[1]、[2]),其中符号后跟jobid可指定特定任务(如%1表示第一个job),jobs的状态通常包括:Running(运行中)、Stopped(已停止/挂起)、Terminated(已终止,通常显示为Done)。
删除jobs的常用方法
根据jobs的状态(运行中/已停止)和删除需求(正常终止/强制终止),可选择以下方法删除jobs。
使用kill命令正常终止jobs
kill命令是Linux中终止进程的核心工具,默认向指定进程发送SIGTERM(信号15),请求进程正常退出,对于jobs,可通过jobid或PID指定目标。
基本语法
kill %jobid # 通过jobid删除jobs kill $PID # 通过进程PID删除jobs(可通过`jobs -l`获取PID)
操作步骤
-
步骤1:查看jobs及对应jobid/PID
执行jobs -l,[1] + 12345 running sleep 100 & [2] - 12346 suspended vim test.txt其中jobid为
%1(对应PID 12345,运行中的sleep 100)、%2(对应PID 12346,已停止的vim test.txt)。 -
步骤2:终止指定jobs
- 终止运行中的job
%1:kill %1
执行后,
sleep 100会收到SIGTERM信号,正常退出,终端可能输出[1] + terminated sleep 100。 - 终止已停止的job
%2:
已停止的jobs仍会接收kill发送的信号,直接执行:kill %2
终止后,
vim test.txt进程会被关闭,终端输出[2] + terminated vim test.txt。
- 终止运行中的job
注意事项
SIGTERM信号可被进程忽略或处理,若jobs未正常退出(如卡死的进程),需改用强制终止(见方法2)。- 若误删除了重要进程,可通过
fg %jobid将jobs切回前台(若未完全终止),或使用jobs确认状态。
使用kill -9强制终止jobs
当kill发送的SIGTERM无效时(如进程无响应),可使用kill -9(发送SIGKILL信号,强制9),该信号不可被忽略,会立即终止进程。

基本语法
kill -9 %jobid # 强制终止指定jobs kill -9 $PID # 强制终止指定PID的进程
操作步骤
假设sleep 100(jobid %1,PID 12345)无法通过kill %1终止,执行:
kill -9 %1
终端输出[1] + killed sleep 100,进程被强制终止。
风险提示
SIGKILL会直接终止进程,未保存的数据可能丢失,仅建议在SIGTERM无效时使用。
通过bg/fg配合删除已停止的jobs
已停止的jobs(状态为Stopped)无法直接通过kill终止(部分系统支持,但建议先转为运行状态),需先使用bg(background)将其转为后台运行,再执行删除。
操作步骤
-
步骤1:将已停止jobs转为后台运行
假设vim test.txt(jobid%2)已停止,执行:bg %2
终端输出
[2] + vim test.txt &,jobs状态转为Running。 -
步骤2:终止运行中的jobs
执行kill %2或kill -9 %2终止进程。
使用disown让jobs脱离终端管理(间接“删除”)
若希望jobs在终端关闭后仍继续运行(即脱离当前shell管理),可使用disown命令,此时jobs不再属于当前终端的jobs列表,相当于“删除”了终端对该jobs的管理记录。
基本语法
disown [-h] [-ar] [jobspec...]
-h:标记jobs,不立即移除,但终端关闭后不再挂断该jobs。-a:移除所有jobs。-r:仅移除运行中的jobs。jobspec:指定jobid(如%1),默认移除当前终端的最后一个jobs。
操作步骤
-
方法1:标记jobs,终端关闭后继续运行
对运行中的sleep 100(jobid%1)执行:disown -h %1
此时终端关闭后,
sleep 100会继续运行,不再受终端影响。
-
方法2:直接移除jobs(脱离终端管理)
执行:disown %1
再次执行
jobs,会发现%1已从列表中消失,但进程仍在后台运行(可通过ps aux | grep sleep查看)。
适用场景
适用于需要长期运行的后台任务(如下载、数据备份),避免误关闭终端导致任务中断。
批量删除jobs的技巧
当终端存在多个jobs时,可通过以下方式批量删除:
结合jobs和xargs批量删除
jobs -r | awk '{print $1}' | xargs -I {} kill {}
jobs -r:仅列出运行中的jobs。awk '{print $1}':提取每行的jobid(如[1])。xargs -I {} kill {}:将jobid作为参数传给kill命令。
通过for循环删除所有jobs
for job in $(jobs -p); do kill $job; done
jobs -p:输出所有jobs的PID。for循环遍历PID并执行kill。
使用kill %1 %2 ...指定多个jobid
若明确jobid,可直接列出:
kill %1 %2 %3
常见错误与解决方法
错误1:bash: kill: %1: arguments must be process or job IDs
- 原因:jobid不存在(如jobs已终止,或输入错误jobid)。
- 解决:执行
jobs确认当前jobs列表,检查jobid是否正确。
错误2:bash: kill: (12345) - No such process
- 原因:指定的PID不存在(进程已终止)。
- 解决:通过
ps aux | grep PID确认进程是否存在,或使用jobs -l查看有效PID。
错误3:Permission denied(权限不足)
- 原因:尝试终止其他用户的进程(如系统关键进程)。
- 解决:避免终止非自身进程,若需终止,需使用
sudo kill(但需谨慎,可能影响系统稳定性)。
相关问答FAQs
Q1:删除jobs时提示“bash: kill: (jobid) – No such process”,怎么办?
解答:该错误表示指定的jobid或PID对应的进程已不存在,可能原因包括:
- 进程已正常终止(如
sleep 100执行完毕)。 - jobid输入错误(如误将
%1写成%2)。
解决步骤: - 执行
jobs命令确认当前终端的jobs列表,检查jobid是否有效。 - 若jobs列表为空,说明进程已终止;若存在jobs,核对jobid后重试。
- 若仍报错,可通过
ps aux | grep 进程名确认进程是否真的存在,避免误删。
Q2:如何让jobs在终端关闭后仍继续运行,避免被“删除”?
解答:默认情况下,关闭终端会向该终端的所有jobs发送SIGHUP(挂断信号),导致jobs终止,若希望jobs脱离终端管理,可使用disown命令或nohup工具。
方法1:使用disown(适用于已启动的jobs)
# 启动后台任务 sleep 100 & # 标记jobs,终端关闭后继续运行 disown -h %1 # 或直接移除jobs(脱离终端管理) disown %1
方法2:使用nohup(启动时直接脱离终端)
nohup sleep 100 > output.log 2>&1 &
nohup:忽略SIGHUP信号,终端关闭后进程不终止。> output.log 2>&1:将标准输出和错误输出重定向到文件,避免终端依赖。
执行后,jobs会独立运行,关闭终端不影响其执行,可通过ps aux | grep sleep查看进程状态。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/38111.html