Files
Knowledge/1 使用/程序在后台执行的技巧.md

119 lines
3.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Linux 下 `bg` / `fg` 的典型用法
1. 启动一个长时间运行的前台进程
```bash
$ tar czf huge.tgz /very/big/dir
# 终端被占用
```
2. 挂起(Suspend)该进程
按下 `Ctrl-Z`
```
[1]+ Stopped tar czf huge.tgz /very/big/dir
```
3. 查看当前 shell 的作业列表
```bash
$ jobs
[1]+ Stopped tar czf huge.tgz /very/big/dir
```
4. 让被挂起的进程在 **后台** 继续运行
```bash
$ bg %1 # “%1” 对应 jobs 输出的作业号
[1]+ tar czf huge.tgz /very/big/dir &
```
5. 把后台作业切回 **前台**
```bash
$ fg %1
tar czf huge.tgz /very/big/dir
```
6. 启动时就丢到后台(可选)
```bash
$ tar czf huge.tgz /very/big/dir &
[1] 12345
```
7. 配合 `disown` 避免挂起时收到 SIGHUP(可选)
```bash
$ disown %1
```
> 提示
> - `%+` 或 `%%` 指“当前作业”;`%-` 指“前一个作业”。
> - 没有参数时,`bg`/`fg` 默认操作当前作业。
在Windows操作系统中,没有与Unix/Linux的 `fg`(前台恢复)和 `bg`(后台运行)完全等效的直接命令,因为Windows的进程管理机制不同。但可以通过以下方法实现类似功能:
---
### **Windows 替代方案**
#### 1. **启动后台进程**
- **CMD 命令提示符**:
```cmd
start /B your_command.exe :: 后台启动(不创建新窗口)
start "" your_command.exe :: 启动并最小化到后台(创建新窗口)
```
- **PowerShell**:
```powershell
Start-Job -ScriptBlock { your_command.exe } # 创建后台作业
```
#### 2. **管理后台进程**
- **查看所有进程**:
```cmd
tasklist :: CMD中查看进程列表
```
```powershell
Get-Process :: PowerShell中查看进程
Get-Job :: 查看后台作业
```
- **挂起/恢复进程**:
- 使用 **`Suspend-Process`** 和 **`Resume-Process`**(需 **管理员权限**):
```powershell
Suspend-Process -Id <PID> # 挂起进程(类似Ctrl+Z)
Resume-Process -Id <PID> # 恢复进程(类似fg)
```
- 工具替代:使用 **[Sysinternals Suite](https://learn.microsoft.com/zh-cn/sysinternals/)** 中的:
- `pssuspend.exe <PID>` 挂起进程
- `pssuspend.exe -r <PID>` 恢复进程
#### 3. **将进程移到前台**
- 无直接命令,需手动操作:
- 通过任务管理器找到进程并激活窗口。
- 使用 `start /WAIT your_command.exe` 在CMD中等待前台完成。
---
### **PowerShell 作业管理示例**
```powershell
# 启动后台作业
$job = Start-Job -ScriptBlock { ping www.example.com }
# 查看作业
Get-Job
# 恢复作业到前台(等待输出)
Receive-Job -Id $job.Id -Wait
# 终止作业
Stop-Job -Id $job.Id
```
---
### **关键差异说明**
- **作业控制机制**:
Windows不原生支持Shell层的作业挂起(`Ctrl+Z`),而是依赖进程级API。
- **权限要求**:
挂起/恢复进程需管理员权限,且可能影响稳定性。
- **推荐工具**:
使用 **PowerShell** 或 **Sysinternals工具集** 实现最接近的功能。
> **建议**:对于复杂任务,推荐使用PowerShell脚本或第三方工具(如Cygwin/WSL)模拟Unix环境。