119 lines
3.3 KiB
Markdown
119 lines
3.3 KiB
Markdown
|
||
## 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环境。 |