在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