entry: foreground and background proc
This commit is contained in:
parent
017dba7713
commit
0766a6cfec
1 changed files with 105 additions and 0 deletions
105
zk/Foreground_and_background_processes.md
Normal file
105
zk/Foreground_and_background_processes.md
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
---
|
||||||
|
tags:
|
||||||
|
- Linux
|
||||||
|
---
|
||||||
|
|
||||||
|
## Use `&` to send a process to background
|
||||||
|
|
||||||
|
Here is a dummy [process](./Processes.md):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bash -c 'while sleep 5; do echo "Still running... $(date +%T)"; done'
|
||||||
|
```
|
||||||
|
|
||||||
|
If I run this normally, it will continue to print every 5 seconds and I can't
|
||||||
|
use the terminal.
|
||||||
|
|
||||||
|
If I append `&` it will run in the background:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
|
||||||
|
bash -c 'while sleep 5; do echo "Still running... $(date +%T)"; done' &
|
||||||
|
# [1] 13134
|
||||||
|
```
|
||||||
|
|
||||||
|
It prints the job number (`[1]`) and the PID of the process.
|
||||||
|
|
||||||
|
Now `stdout` will continue to interrupt every 5 seconds but I can do other
|
||||||
|
things in the foreground, e.g:
|
||||||
|
|
||||||
|
```
|
||||||
|
~ bash -c 'while sleep 5; do echo "Still running... $(date +%T)"; done' &
|
||||||
|
[2] 13505
|
||||||
|
➜ ~ Still running... 18:20:42
|
||||||
|
echo 'i can still use terminal'
|
||||||
|
i can still use terminal
|
||||||
|
➜ ~ Still running... 18:20:47
|
||||||
|
Still running... 18:20:47
|
||||||
|
```
|
||||||
|
|
||||||
|
> Notice now I have two processes running (the same print script, twice), so the
|
||||||
|
> job number has incremented to `[2]`
|
||||||
|
|
||||||
|
## Bring a background process back to the foreground
|
||||||
|
|
||||||
|
Use `%<job-number>` or `%<pid` to bring a process back to the foreground:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
|
||||||
|
fg %1
|
||||||
|
# [1] - 13134 running bash -c 'while sleep 5; do echo "Still running... $(date +%T)"; done'
|
||||||
|
# Still running... 18:23:22
|
||||||
|
# Still running... 18:23:22
|
||||||
|
# Still running... 18:23:27
|
||||||
|
```
|
||||||
|
|
||||||
|
Now it's back in the foreground and I cannot use the terminal:
|
||||||
|
|
||||||
|
```
|
||||||
|
Still running... 18:24:17
|
||||||
|
ls
|
||||||
|
Still running... 18:24:22
|
||||||
|
Still running... 18:24:22
|
||||||
|
```
|
||||||
|
|
||||||
|
## Pausing a job
|
||||||
|
|
||||||
|
`Ctrl+Z` does not kill the process. It _pauses_ it. This moves it to the
|
||||||
|
background and pauses its execution, returning terminal control back to you.
|
||||||
|
|
||||||
|
For example I've stopped `vim` below:
|
||||||
|
|
||||||
|
```
|
||||||
|
vim minicom.log
|
||||||
|
[1] + 14231 suspended nvim minicom.log
|
||||||
|
```
|
||||||
|
|
||||||
|
Again I'm given the job number.
|
||||||
|
|
||||||
|
For it to continue in the background:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
bg %1
|
||||||
|
```
|
||||||
|
|
||||||
|
Or the foreground:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
fg %1
|
||||||
|
```
|
||||||
|
|
||||||
|
(This will reopen `vim`.)
|
||||||
|
|
||||||
|
## Terminate a job
|
||||||
|
|
||||||
|
```
|
||||||
|
kill %1
|
||||||
|
```
|
||||||
|
|
||||||
|
## View jobs with `jobs`
|
||||||
|
|
||||||
|
```
|
||||||
|
jobs
|
||||||
|
[1] + suspended nvim minicom.log
|
||||||
|
[2] - running bash -c 'while sleep 5; do echo "Still running... $(date +%T)"; done'
|
||||||
|
```
|
||||||
Loading…
Add table
Reference in a new issue