⚠️ 注意:skill命令已过时

skill命令在一些现代Linux发行版中可能不可用或已过时。建议使用pkillkillall命令作为替代。

linux skill命令

skill命令用于向进程发送信号。它可以根据进程名、用户名、终端等多种条件匹配进程,并向匹配的进程发送指定的信号。

语法格式

skill [信号] [选项] 进程标识
skill [信号] [选项] -u 用户名
skill [信号] [选项] -t 终端号
skill [信号] [选项] -p 进程ID
skill [信号] [选项] 进程名

命令功能

  • 根据多种条件匹配进程
  • 向匹配的进程发送指定的信号
  • 可以终止、挂起、恢复进程
  • 支持通配符匹配进程名

📝 重要说明

  • skillsnice命令的符号链接
  • 默认发送TERM信号(15)
  • 需要适当的权限才能向其他用户的进程发送信号
  • 使用时要小心,可能意外终止重要进程

常用信号

信号 数值 说明
SIGHUP 1 挂起,通常用于重新加载配置文件
SIGINT 2 中断(Ctrl+C)
SIGQUIT 3 退出(产生core dump)
SIGKILL 9 强制终止(无法被捕获或忽略)
SIGTERM 15 终止(默认信号)
SIGSTOP 17,19,23 暂停进程
SIGCONT 18,19,25 继续执行已暂停的进程

参数说明

参数 说明
信号 要发送的信号,可以是信号名(如KILL)或信号数值(如9)
-u 用户名 向指定用户的所有进程发送信号
-t 终端号 向指定终端的所有进程发送信号
-p 进程ID 向指定的进程ID发送信号
-c 进程名 向指定名称的进程发送信号(默认选项)
-v 详细模式,显示正在执行的操作
-n 模拟运行,不实际发送信号
-f 快速模式,匹配时立即发送信号
-w 等待所有进程终止
-V 显示版本信息
-h 显示帮助信息

常用示例

示例1:终止指定进程名的进程

使用默认的TERM信号终止进程:

# 查看当前运行的firefox进程
$ ps aux | grep firefox
john     1234  0.5  2.1 123456 7890 ?  Sl   10:00   0:05 /usr/lib/firefox/firefox

# 终止所有firefox进程
$ skill firefox

# 验证进程是否已终止
$ ps aux | grep firefox
# 无输出,表示进程已终止

示例2:发送KILL信号强制终止进程

使用SIGKILL信号强制终止无响应的进程:

# 强制终止所有chrome进程
$ skill -9 chrome
# 或者使用信号名
$ skill KILL chrome
$ skill SIGKILL chrome

示例3:终止指定用户的所有进程

使用-u参数终止特定用户的所有进程:

# 查看testuser用户的进程
$ ps -u testuser
    PID TTY          TIME CMD
   2345 ?        00:00:01 bash
   2346 ?        00:00:02 vim
   2347 ?        00:00:00 ps

# 终止testuser的所有进程(需要root权限)
$ sudo skill -u testuser

# 验证
$ ps -u testuser
    PID TTY          TIME CMD
# 无进程显示

示例4:向指定终端的所有进程发送信号

使用-t参数针对特定终端:

# 查看pts/1终端的进程
$ ps -t pts/1
    PID TTY          TIME CMD
   3456 pts/1    00:00:00 bash
   3457 pts/1    00:00:01 top

# 终止pts/1终端的所有进程
$ skill -t pts/1

# 只发送HUP信号,让进程重新加载配置
$ skill HUP -t pts/1

示例5:暂停和恢复进程

使用STOP和CONT信号控制进程执行:

# 暂停所有python进程
$ skill STOP python

# 查看进程状态
$ ps aux | grep python
john     4567  0.0  0.5  12345  6789 T    10:05   0:00 python script.py
# 状态T表示进程已停止

# 恢复python进程执行
$ skill CONT python

示例6:使用通配符匹配进程

skill支持通配符匹配进程名:

# 终止所有以"test"开头的进程
$ skill test*

# 终止所有包含"server"的进程
$ skill *server*

# 使用-c参数明确指定进程名
$ skill -c apache2
$ skill -c mysql*

示例7:详细模式和模拟运行

使用-v-n参数:

# 详细模式,显示匹配的进程
$ skill -v firefox
Sending SIGTERM to process 1234 (firefox)
Sending SIGTERM to process 1235 (firefox)

# 模拟运行,不实际发送信号
$ skill -n -v apache2
Would send SIGTERM to process 2345 (apache2)
Would send SIGTERM to process 2346 (apache2)

示例8:等待进程终止

使用-w参数等待所有进程终止:

# 发送TERM信号并等待进程终止
$ skill -w -v mysqld
Sending SIGTERM to process 3456 (mysqld)
Waiting for process 3456 to die...
Process 3456 has terminated

⚠️ 安全警告

  1. 谨慎使用KILL信号:SIGKILL(9)无法被进程捕获,可能导致数据丢失
  2. 避免误杀系统进程:不要随意终止系统关键进程
  3. 权限限制:普通用户只能向自己的进程发送信号
  4. 生产环境测试:在生产环境中使用前先测试
  5. 备份重要数据:终止可能修改数据的进程前先备份

💡 现代替代命令

由于skill命令已过时,建议使用以下替代命令:

1. pkill命令(推荐)
# 终止firefox进程
$ pkill firefox

# 强制终止
$ pkill -9 firefox

# 按用户终止
$ pkill -u testuser

# 按终端终止
$ pkill -t pts/1
2. killall命令
# 终止进程
$ killall firefox

# 发送特定信号
$ killall -9 firefox
$ killall -HUP apache2

# 交互式确认
$ killall -i process_name
3. kill命令配合pgrep
# 查找并终止进程
$ kill $(pgrep firefox)

# 强制终止
$ kill -9 $(pgrep firefox)

常见问题

Q: skill命令在我的系统上找不到怎么办?

A: skill可能不是默认安装的。可以使用pkillkillallkill命令作为替代。

Q: skill和kill有什么区别?

A: kill需要进程ID,而skill可以根据进程名、用户名、终端等多种条件匹配进程。

Q: 如何只向特定用户的特定进程发送信号?

A: 可以结合使用-u和进程名:skill -u username process_name

Q: skill发送信号后会有确认吗?

A: 默认没有确认。使用-v参数可以查看详细操作。

Q: 如何列出skill可以发送的所有信号?

A: 使用kill -l可以列出所有可用信号。

相关命令

  • pkill - 根据名称和其他属性查找并发送信号给进程(推荐替代)
  • killall - 按进程名发送信号
  • kill - 向进程发送信号
  • pgrep - 查找进程
  • ps - 显示进程状态
  • snice - 修改进程优先级(与skill相关)