Linux | Job control
文章目录
- Linux | Job control
- 命令
- 直接将命令丢到后台中“执行”的 &
- 将当前工作丢到后台“暂停”:Ctrl + z
- 查看后台工作状态:jobs
- 将后台工作拿到前台处理:fg
- 让工作在后台下的状态变成运行中:bg
- 管理后台工作: kill
- signal 具体含义
- 脱机管理
- nohup
- 欢迎关注公众号【三戒纪元】
工作管理(job control)是登录系统,取得bash shell之后,在单一终端机下同时进行多个工作的行为管理。
进行bash的job control 的限制是:
- 这些工作所触发的进程必须来自于shell的子进程(只管理自己的bash)
- 前台:可以控制与执行命令的环境成为前台工作
- 后台:可以自行运行的干工作,无法按使用
ctrl + c
终止它,可以使用bg/fg
调用该工作 - 后台中“执行”的进程不能等待 terminal / shell 的输入(input)
命令
直接将命令丢到后台中“执行”的 &
例如将某个压缩行为丢到后台
tar -zpcf /tmp/randy.tar.gz /etc &
tar -zpcf randy_File.tar.gz randy_File/ &
[1] 9762
(base) qiancj@qiancj-HP-ZBook-G8:~$ ls randy_File.tar.gz
randy_File.tar.gz
[1]+ Done tar -zpcf randy_File.tar.gz randy_File/
这里会返回 [ j o b n u m b e r ] P I D [job \ number ] PID [job number]PID
- job number : 工作号码,与bash d的控制有关
- 9762: PID, progress ID,进程号
如果后台进程有很多日志,可以通过数据流重定向,将输出数据传送到某个文件中:
ar -zpcvf randy_File.tar1.gz randy_File > log_randy.txt 2>&1 &
[1] 10664
将当前工作丢到后台“暂停”:Ctrl + z
如果正好在使用vi,但是有个文件路径不知道在哪里,需要查找一下,此时可以将vi 丢到后台即可
(base) qiancj@qiancj-HP-ZBook-G8:~$ vi ~/.bashrc
[1]+ Stopped vi ~/.bashrc
(base) qiancj@qiancj-HP-ZBook-G8:~$ find ./ -name randy
....
^Z
[2]+ Stopped find ./ -name randy
[numbeer]
表示工作号码
Stopped
表示工作暂停了
查看后台工作状态:jobs
(base) qiancj@qiancj-HP-ZBook-G8:~$ jobs --help
jobs: jobs [-lnprs] [jobspec ...] or jobs -x command [args]
Display status of jobs.
Lists the active jobs. JOBSPEC restricts output to that job.
Without options, the status of all active jobs is displayed.
Options:
-l lists process IDs in addition to the normal information
-n lists only processes that have changed status since the last
notification
-p lists process IDs only
-r restrict output to running jobs
-s restrict output to stopped jobs
If -x is supplied, COMMAND is run after all job specifications that
appear in ARGS have been replaced with the process ID of that job's
process group leader.
Exit Status:
Returns success unless an invalid option is given or an error occurs.
If -x is used, returns the exit status of COMMAND.
参数:
- -l : 列出 job number 和 PID号码
- -r: 仅列出正在后台run的工作
- -s: 仅列出后台stop的干工作
- -n: 仅列出自上次通知以来状态已更改的进程
- -p: 仅列出进程 ID
(base) qiancj@qiancj-HP-ZBook-G8:~$ jobs
[1]- Stopped vim randy.sanjiejiyuan
[2]+ Stopped find . -name randy
[3] Exit 1 find . -name sanjiejiyuan
(base) qiancj@qiancj-HP-ZBook-G8:~$ jobs -l
[1]- 13295 Stopped vim randy.sanjiejiyuan
[2]+ 13421 Stopped find . -name randy
(base) qiancj@qiancj-HP-ZBook-G8:~$ jobs -s
[1]- Stopped vim randy.sanjiejiyuan # - 表示倒数第二个加入后台的工作
[2]+ Stopped find . -name randy # + 表示最近加入后台的工作
(base) qiancj@qiancj-HP-ZBook-G8:~$ jobs -r
(base) qiancj@qiancj-HP-ZBook-G8:~$ jobs -n
(base) qiancj@qiancj-HP-ZBook-G8:~$ jobs -p
13295
13421
将后台工作拿到前台处理:fg
fg %[job number]
(base) qiancj@qiancj-HP-ZBook-G8:~$ fg <== 默认取出 + 的工作,即[2]
find . -name randy
(base) qiancj@qiancj-HP-ZBook-G8:~$ fg %1 <== 取出规定的工作号码
vim randy.sanjiejiyuan
让工作在后台下的状态变成运行中:bg
(base) qiancj@qiancj-HP-ZBook-G8:~$ jobs ; bg %1; jobs
[1]+ Stopped find / -name randy > log_randy.txt
[1]+ find / -name randy > log_randy.txt &
[1]+ Running find / -name randy > log_randy.txt &
管理后台工作: kill
强制删除后台工作
使用方法
kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
kill: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Send a signal to a job.
Send the processes identified by PID or JOBSPEC the signal named by
SIGSPEC or SIGNUM. If neither SIGSPEC nor SIGNUM is present, then
SIGTERM is assumed.
Options:
-s sig SIG is a signal name
-n sig SIG is a signal number
-l list the signal names; if arguments follow `-l' they are
assumed to be signal numbers for which names should be listed
-L synonym for -l
Kill is a shell builtin for two reasons: it allows job IDs to be used
instead of process IDs, and allows processes to be killed if the limit
on processes that you can create is reached.
Exit Status:
Returns success unless an invalid option is given or an error occurs.
简单用法就是 kill -signal %[job number]
- kill -l : 列出当前能够使用的信号有哪些
(base) qiancj@qiancj-HP-ZBook-G8:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
(base) qiancj@qiancj-HP-ZBook-G8:~$ kill -l SIGQUIT
3
(base) qiancj@qiancj-HP-ZBook-G8:~$ kill -l QUIT
3
(base) qiancj@qiancj-HP-ZBook-G8:~$ kill -l 9
KILL
例如:
- 1 SIGHUP : 重新读取1次参数配置文件,类似reload
- 2 SIGINT : 等同于 ctrl + c
- 9 SIGKILL: 立即强制删除1个工作
- 15 SIGTERM: 以正常的程序方式终止1项工作
所以平时所用的 kill -9 PID
,杀死进程的命令,如今知道具体含义了。
此外还有:
- ctrl-c 发送 SIGINT 信号给前台进程组中的所有进程
- ctrl-z 发送 SIGTSTP 信号给前台进程组中的进程
- ctrl-\ 发送 SIGQUIT 信号给前台进程组中的进程,终止前台进程并生成 core 文件
signal 具体含义
Signal Standard Action Comment
────────────────────────────────────────────────────────────────────────
SIGABRT P1990 Core Abort signal from abort(3)
SIGALRM P1990 Term Timer signal from alarm(2)
SIGBUS P2001 Core Bus error (bad memory access)
SIGCHLD P1990 Ign Child stopped or terminated
SIGCLD - Ign A synonym for SIGCHLD
SIGCONT P1990 Cont Continue if stopped
SIGEMT - Term Emulator trap
SIGFPE P1990 Core Floating-point exception
SIGHUP P1990 Term Hangup detected on controlling terminal
or death of controlling process
SIGILL P1990 Core Illegal Instruction
SIGINFO - A synonym for SIGPWR
SIGINT P1990 Term Interrupt from keyboard
SIGIO - Term I/O now possible (4.2BSD)
SIGIOT - Core IOT trap. A synonym for SIGABRT
SIGKILL P1990 Term Kill signal
SIGLOST - Term File lock lost (unused)
SIGPIPE P1990 Term Broken pipe: write to pipe with no
readers; see pipe(7)
SIGPOLL P2001 Term Pollable event (Sys V).
Synonym for SIGIO
SIGPROF P2001 Term Profiling timer expired
SIGPWR - Term Power failure (System V)
SIGQUIT P1990 Core Quit from keyboard
SIGSEGV P1990 Core Invalid memory reference
SIGSTKFLT - Term Stack fault on coprocessor (unused)
SIGSTOP P1990 Stop Stop process
SIGTSTP P1990 Stop Stop typed at terminal
SIGSYS P2001 Core Bad system call (SVr4);
see also seccomp(2)
SIGTERM P1990 Term Termination signal
SIGTRAP P2001 Core Trace/breakpoint trap
SIGTTIN P1990 Stop Terminal input for background process
SIGTTOU P1990 Stop Terminal output for background process
SIGUNUSED - Core Synonymous with SIGSYS
SIGURG P2001 Ign Urgent condition on socket (4.2BSD)
SIGUSR1 P1990 Term User-defined signal 1
SIGUSR2 P1990 Term User-defined signal 2
SIGVTALRM P2001 Term Virtual alarm clock (4.2BSD)
SIGXCPU P2001 Core CPU time limit exceeded (4.2BSD);
see setrlimit(2)
SIGXFSZ P2001 Core File size limit exceeded (4.2BSD);
see setrlimit(2)
SIGWINCH - Ign Window resize signal (4.3BSD, Sun)
脱机管理
上述放到后台的工作,是可以避免 Ctrl + C 中断的,并不是放到系统后台去。因此,工作管理的后台依旧与终端有关。
如果将工作 以 &
方式放到后台,当我们关闭终端时,工作不会继续。当工作放到远程 Linux主机,当我们脱机后,工作不会继续进行,而是被中断掉。
nohup
nohup 可以在脱机或注销系统后,还能够让工作继续进行。
用法:
nohup [命令与参数] <===== 在终端机前台工作
nohup [命令与参数] & <===== 在终端机后台工作
注意:nohup 并不支持bash 内置命令,因此命令必须是外部命令才行。
因此可以将命令编写到 python里或shell脚本里。
执行日志会被定向到 ~/nohup.out
文件中。
可以使用tail -f ~/nohup.out
命令持续查看。