前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux16-编程3-程序后台执行指西

linux16-编程3-程序后台执行指西

作者头像
北野茶缸子
发布2022-05-19 11:49:30
6760
发布2022-05-19 11:49:30
举报
文章被收录于专栏:北野茶缸子的专栏

前言

抽空来总结一下linux 的程序后台操作吧,其实非常简单。

1-基本操作

主要结构如下:

代码语言:javascript
复制
nohup sleep 100 &
  • nohup 表示即使终端终止,该进程也不会被kill,默认输出会被重定向到nohup.out;
  • & 表示将命令挂载到后台;

比如上面,就是一个歇100s 的程序。

2-重定向输出

比如,有时候,我们把程序放在后台了,希望其输出也进行保存,而不是混乱而无序的输出到前台,我们就可以使用重定向。

代码语言:javascript
复制
nohup sleep 100 1>out.txt 2>&1 &

其中,1> 表示标准输出重定向,而2> 表示错误重定向,用于捕获程序错误执行的输出内容。这里我们将标准输出重定向到一个文件,而将错误输出同样定向到标准输出,而此时标准输出已经重定向到文件,因此错误输出也会重定向到该文件中。

还有一个技巧是,有时候我们并不希望保留输出,可以将内容重定向到空文件/dev/null,或是输出到tmp 目录下(重启后会清除):

代码语言:javascript
复制
nohup echo 'so boring.' >/dev/null

3-程序前后台变变变

有时候,我们可能想要将后台的程序返回前台。

我们可以通过下面的方式实现:

代码语言:javascript
复制
❯ 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 后,将其放到后台继续执行:

代码语言:javascript
复制
❯ sleep 1000
^Z
[1]  + 8289 suspended  sleep 1000
❯ jobs -l
[1]  + 8289 suspended  sleep 1000
❯ bg %1
[1]  + 8289 continued  sleep 1000

我们可以查看一下:

代码语言:javascript
复制
❯ 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

果然已经在后台了。

4-查看后台进程及批量终止

后台执行的一个缺点就是,你不知道你一下子开了多少个程序并行。

我们可以通过kill 指令,终止进程。

代码语言:javascript
复制
❯ 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 结束,包在一起就是:

代码语言:javascript
复制
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]

代码语言:javascript
复制
dmesg | egrep -i -B100 'killed process'

今天,你学废了吗?

参考资料

[1]

linux 程序被Killed,如何精准查看日志_shuihupo的博客-CSDN博客: https://blog.csdn.net/shuihupo/article/details/80905641

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 北野茶缸子 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1-基本操作
  • 2-重定向输出
  • 3-程序前后台变变变
  • 4-查看后台进程及批量终止
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档