Java命令行程序阻断操作系统Ctrl+C信号

解决SSH连接中Ctrl+C中断Java程序问题
本文介绍了一种基于SunJDK的解决方案,用于在使用SSH连接到服务器时,通过设置信号处理器来避免在按下Ctrl+C时直接关闭Java程序,而是在服务器端执行的命令结束后再终止。
部署运行你感兴趣的模型镜像
最近在写个基于ssh协议进行命令行的服务器管理维护系统,基于Java的,遇到一个难题是,在ssh连接到服务器之后,Ctrl+C会直接把我的Java程序关掉而不是结束远程服务器上的命令。

找到一个基于Sun JDK的解决办法,记录一下(Win7,Redhet,CentOS上测试可行):

// 创建一个信号处理器
sun.misc.SignalHandler handler = new sun.misc.SignalHandler() {
@Override
public void handle(sun.misc.Signal signal) {
// 什么都不做
}
};
// 设置INT信号(Ctrl+C中断执行)交给指定的信号处理器处理,废掉系统自带的功能
sun.misc.Signal.handle(new sun.misc.Signal("INT"), handler);

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

这是一个非常好的问题! 在 Shell 脚本中,**默认是支持使用 `Ctrl + C`(即 `SIGINT` 信号)来中断脚本的执行**。如果你发现 `Ctrl + C` 无法停止脚本,那**通常是因为脚本中存在某些行为阻断或忽略了这个信号**。 --- ## ✅ 简短回答: Shell 脚本默认是支持 `Ctrl + C` 中断的,**如果你的脚本无法用 `Ctrl + C` 停止,通常是因为以下原因之一:** 1. 脚本中使用了 `trap` 忽略了 `SIGINT`; 2. 脚本调用了某些子进程(如 `sleep`、`read`、`ffmpeg` 等),它们屏蔽了信号; 3. 脚本中执行了某些阻塞操作,如 `while read` 长时间等待输入; 4. 脚本中使用了后台进程但主脚本没有正确退出; 5. 使用了 `wait` 但未处理信号中断。 --- ## ✅ 示例说明 ### 示例 1:正常支持 `Ctrl + C` ```sh #!/bin/sh while true; do echo "Running..." sleep 1 done ``` 这个脚本会每秒打印一次 `Running...`,你可以用 `Ctrl + C` 中断它。 --- ### 示例 2:被 `trap` 屏蔽的脚本(不响应 `Ctrl + C`) ```sh #!/bin/sh trap '' INT # 忽略 SIGINT 信号 while true; do echo "Running..." sleep 1 done ``` 在这个脚本中,`trap '' INT` 表示忽略 `Ctrl + C`,你将无法用 `Ctrl + C` 停止它。 > 你可以用 `Ctrl + Z` 暂停它,然后用 `kill %1` 终止。 --- ### 示例 3:阻塞在 `read` 或 `sleep` 上的脚本 ```sh #!/bin/sh echo "Press Enter to continue..." read # 阻塞等待输入 ``` 如果你在这个脚本卡在 `read` 时按下 `Ctrl + C`,它会被中断。 但如果脚本如下: ```sh #!/bin/sh while true; do sleep 10 done ``` 在 `sleep 10` 执行期间按下 `Ctrl + C`,脚本会立即终止。 --- ### 示例 4:后台进程导致主脚本不退出 ```sh #!/bin/sh sleep 100 & wait $! # 等待后台进程结束 ``` 在这种情况下,即使你按下 `Ctrl + C`,主脚本仍然会等待 `sleep 100` 完成。 你可以这样改进: ```sh #!/bin/sh trap 'kill $(jobs -p) >/dev/null 2>&1; exit' INT sleep 100 & wait $! ``` 这样,当按下 `Ctrl + C` 时,脚本会杀死后台进程并退出。 --- ## ✅ 如何调试你的脚本是否响应 `Ctrl + C` 1. 确保脚本中没有使用 `trap '' INT`; 2. 如果脚本调用了其他程序(如 `ffmpeg`、`rsync`、`tail -f`),检查它们是否屏蔽了 `SIGINT`; 3. 如果脚本中有 `read`、`sleep`、`wait` 等阻塞操作,确保它们不会阻止信号传递; 4. 可以手动在脚本中添加 `trap 'echo "Caught SIGINT"; exit' INT` 来测试信号是否被接收。 --- ## ✅ 总结:Shell 脚本中 `Ctrl + C` 不起作用的常见原因 | 原因 | 是否影响 `Ctrl + C` | 解决方法 | |------|----------------------|-----------| | 使用 `trap '' INT` | ❌ 不响应 | 删除或修改 trap | | 阻塞在 `read` / `sleep` | ✅ 通常响应 | 一般没问题 | | 使用 `wait` 等待子进程 | ✅ 但可能延迟响应 | 可添加 trap 处理 | | 子进程忽略信号 | ❌ 不响应 | 主动 kill 子进程 | | 后台进程未清理 | ❌ 主进程不退出 | 使用 trap 清理后台进程 | --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值