抽空来总结一下linux 的程序后台操作吧,其实非常简单。
主要结构如下:
nohup sleep 100 &
比如上面,就是一个歇100s 的程序。
比如,有时候,我们把程序放在后台了,希望其输出也进行保存,而不是混乱而无序的输出到前台,我们就可以使用重定向。
nohup sleep 100 1>out.txt 2>&1 &
其中,1> 表示标准输出重定向,而2> 表示错误重定向,用于捕获程序错误执行的输出内容。这里我们将标准输出重定向到一个文件,而将错误输出同样定向到标准输出,而此时标准输出已经重定向到文件,因此错误输出也会重定向到该文件中。
还有一个技巧是,有时候我们并不希望保留输出,可以将内容重定向到空文件/dev/null,或是输出到tmp 目录下(重启后会清除):
nohup echo 'so boring.' >/dev/null
有时候,我们可能想要将后台的程序返回前台。
我们可以通过下面的方式实现:
❯ nohup sleep 1000 >/dev/null &
[1] 7018
❯ jobs -l
[1] + 7018 running nohup sleep 1000 > /dev/null
❯ fg %1
[1] + 7018 running nohup sleep 1000 > /dev/null
我们通过fg %n
的方式,将后台程序拉回前台。需要注意的是,n表示job number(我们可以通过jobs查看进程编号,而非pid)。
同样,我们还可以将前台的程序挂起到后台执行,个人觉得这里需求会更多一些。使用ctrl+z
对前台程序挂起到后台,再同样查找进程job number 后,将其放到后台继续执行:
❯ sleep 1000
^Z
[1] + 8289 suspended sleep 1000
❯ jobs -l
[1] + 8289 suspended sleep 1000
❯ bg %1
[1] + 8289 continued sleep 1000
我们可以查看一下:
❯ ps -ef | grep sleep
501 8912 8759 0 9:32下午 ttys000 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox sleep
501 8289 6397 0 9:31下午 ttys001 0:00.00 sleep 1000
果然已经在后台了。
后台执行的一个缺点就是,你不知道你一下子开了多少个程序并行。
我们可以通过kill 指令,终止进程。
❯ tldr kill
kill
Sends a signal to a process, usually related to stopping the process.
All signals except for SIGKILL and SIGSTOP can be intercepted by the process to perform a clean exit.
More information: https://manned.org/kill.
- Terminate a program using the default SIGTERM (terminate) signal:
kill process_id
- List available signal names (to be used without the `SIG` prefix):
kill -l
- Terminate a background job:
kill %job_id
- Terminate a program using the SIGHUP (hang up) signal. Many daemons will reload instead of terminating:
kill -1|HUP process_id
- Terminate a program using the SIGINT (interrupt) signal. This is typically initiated by the user pressing `Ctrl + C`:
kill -2|INT process_id
- Signal the operating system to immediately terminate a program (which gets no chance to capture the signal):
kill -9|KILL process_id
- Signal the operating system to pause a program until a SIGCONT ("continue") signal is received:
kill -17|STOP process_id
- Send a `SIGUSR1` signal to all processes with the given GID (group id):
kill -SIGUSR1 -group_id
如果通过如htop 等一个个找pid:
那得累死。
因此,我们可以通过ps -ef 获取进程静态信息,使用grep 指定相关进程,使用awk 截取,使用while 循环执行,使用 kill 结束,包在一起就是:
ps -ef | grep xx | grep command | awk '{print $2}' | while read id; do kill $id ;done
这个xx,也就是你要查找的对应进程包含的命令,比如Rscript,sleep 等等。
对了,utools 有个很好用的插件:
这么长的命令,自然是不要自己记住的。
另外,有的时候因为各种原因,自己的程序突然终止,重定向输出信息也并不清楚,该怎么查看程序终止的原因呢?linux 程序被Killed,如何精准查看日志_shuihupo的博客-CSDN博客[1]
dmesg | egrep -i -B100 'killed process'
今天,你学废了吗?
[1]
linux 程序被Killed,如何精准查看日志_shuihupo的博客-CSDN博客: https://blog.csdn.net/shuihupo/article/details/80905641