让linux程序在后台运行

最近要用php进程发奖励,因为要精确到秒执行,linux系统的定时用不了,于是写了个死循环,usleep是必须的,否则系统cpu占用很高的系统cpu。

执行的时候碰到一个问题,关闭终端后进程也终止了。在此记录下解决方法。

define('IN_WEB', 'true');
set_time_limit(0);
include(dirname(__FILE__)."/../com.php");
$pidFile = PATH_DAT . 'ticket.pid';
if(file_exists($pidFile)){
    exit('process is exsits!');
}
file_put_contents($pidFile, posix_getpid());
while(true){
    if(time()% 30 == 0){
        //doing
    }
    usleep(1000);
}

有些时候,我们需要在终端启动一个程序,并使之运行——但是如果关闭终端,那么这个程序也就随着关闭了。那么有没有什么方法在关闭终端后,让已经从这个终端启动的程序继续运行呢?

前置知识: xterm,console,tty,pts,pty的区别

  • shell是直接和内核进行通信的东西
  • xterm是一个软件概念,可以通过这个程序连接到console从而控制主机,可以理解为cli形式的终端模拟器,而gnome-terminal,konsole就是gui形式的终端模拟器
  • console是主机的控制台,是一个物理概念。
  • tty、pty、pts都是终端,是硬件或者设备概念。
  • tty是所有终端设备的总称
  • pty是其中一类,伪终端,或者叫虚拟终端
  • “&” 命令行结尾法:

在Unix/Linux下如果想让程序独立终端运行,一般都是使用 & 在命令结尾来让程序自动运行。(命令后可以不追加空格)

打开gnome-terminal,执行如下命令:

delectate@delectate:~$ totem &
[1] 8510
delectate@delectate:~$ 
有几点需要注意:
  1. 已经启动的程序依然attach于当前pts,只有当前终端模拟器关闭(使用exit命令退出),进程自动被tty继承。
delectate@delectate:~$ ps -e | grep totem
    //程序已被以totem & 形式启动,当前附在pts0上
8819 pts/0    00:00:00 totem
delectate@delectate:~$ ps -e | grep totem
   //pts0的模拟终端被exit命令关闭,totem自动附在tty
8819 ?        00:00:00 totem
delectate@delectate:~$
  1. 具有debug输出的进程,需要按enter键进行中断当前debug输出。但是如果程序持续进行printf,你将无法输入任何命令。
delectate@delectate:~$ vlc &
[1] 8850
delectate@delectate:~$ VLC media player 1.0.6 Goldeneye
[0x8b998b0] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
                                                               //enter pressed
delectate@delectate:~$                               //show a clean terminal now
** (:8850): CRITICAL **: giop_thread_request_push: assertion `tdata != NULL' failed
                                                               //仍然在输出数据……
                                                               //关闭程序
[1]+  Done                    vlc
delectate@delectate:~$
  1. 你无法记录程序的debug输出结果。
  2. 只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按enter——如果程序持续输出信息而没有出现 $ 或 #)
  • 使用nohup命令:

nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中断/挂起信号,使命令继续执行)

但是当你尝试使用命令:

nohup command

时候却会遇到不大不小的麻烦……

delectate@delectate:~$ nohup vlc
nohup: ignoring input and appending output to `nohup.out'

是的,虽然它自动把debug信息记录到nohup.out文件,但是你却无法使用这个终端进行任何操作。

所以你需要和第一个方法混用,即

nohup command {option} &

混用后,它会自动把你执行的命令输出结果记录到权限为-rw——-,名为nohup.out的文件中。

但是你仍然需要

delectate@delectate:~$ nohup vlc &
[1] 9045
delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out'
                                                                         //在这里按一下回车或以ctrl+c以
                                                                             //show a clean terminal 
delectate@delectate:~$

与使用 “&” 性质相同,当前启动程序的终端如果没有被关闭,已经启动的程序附在pst上;如果终端被关闭,则自动附在tty。

如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out。默认状态下,nohup默认输出到nohup.out文件,你也可以利用重定向来指定输出文件:

nohup command {option} > myout.file 2>&1 &

只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按enter——如果程序持续输出信息而没有出现 $ 或 #)

  • 其他相关命令:

jobs:查看当前有多少在后台运行的命令 fg:将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid) bg:将一个在后台暂停的命令,变成继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

  • 杀死进程

杀死已经启动的程序和普通方式一样:

  • pkill -9 name
  • killall name
  • kill pid
  • 命令应用:

linux服务器挂机下载;启动相关服务;linux服务器启动进程(尤其是ssh登录)

我就曾经用

nohup aria2c -i downloadlist -m 0 -j 1 &

从jsharer极享下载了不少动漫。

  • 参考资料

http://topic.csdn.net/u/20100201/17/a34370cc-8a61-4315-a4d0-84242362064d.html http://www.linuxsir.org/bbs/thread362001.html http://www.williamlong.info/archives/482.html http://dev.firnow.com/course/6_system/linux/Linuxjs/2008716/133186.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏磨磨谈

ceph luminous 新功能之磁盘智能分组

本篇是luminous一个新功能介绍,关于磁盘智能分组的,这个在ceph里面叫crush class,这个我自己起名叫磁盘智能分组,因为这个实现的功能就是根据磁...

1272
来自专栏程序员叨叨叨

PHP通信接口大坑集锦

最近因为毕设在搭建接口及数据库环境,使用Apache+MySQL+PHP在阿里云ECS服务器中配置,之前在本地配置过并成功实现,但是在阿里云中却频频出错,记录下...

1192
来自专栏张戈的专栏

分享两种外链跳转方法,可避免权重流失。

前 2 天,在修改互推联盟自适应页面时,考虑到原先的跳转机制可能会对博友造成困扰,所以想修改成直接跳转模式,彻底抛弃之前强行重写 title 即 iframe ...

41510
来自专栏北京马哥教育

基于ansible role实现LAMP平台批量部署

前言 作为运维人员,当面对几十台或上百台服务器需要修改某个参数或部署某个平台,你将从何入手呢?ansible的出现很好的解决了这一困扰,ansible基于P...

2424
来自专栏大数据挖掘DT机器学习

python模拟新浪微博登陆功能(新浪微博爬虫)

有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录。 浏览器访问服务器的过程 在用户访问网页时...

8505
来自专栏macOS 开发学习

Mac开发基础练习:制作一个状态栏(NSStatusBar)上的App(二)

1.1 选中ViewController.m文件,添加鼠标左键点击事件监听,实现代码如下图:

903
来自专栏技术墨客

React由0到1

    本文记录了本人以及目前团队从无到有使用React的过程,我们将从webpack开始说起,一步一步展现React最基本的开发生态。在这里并不会介绍任何js...

1063
来自专栏运维小白

Git客户端安装及使用

背景 为了我帅气而高大尚的博客一直在研究github,在网上找了一圈,找到了Git的客户端 安装github Git是目前世界上最先进的分布式版本控制系统,gi...

3388
来自专栏运维小白

Linux基础(day67)

19.7 主动模式和被动模式 主动模式和被动模式 主动或者被动是相对客户端来讲的 被动模式,服务端会主动连接客户端获取监控项目数据,客户端被动地接受连接...

2109
来自专栏信安之路

bWAPP 玩法总结

bWAPP(buggy web Application)是一个集成了了常见漏洞的 web 应用程序,目的是作为漏洞测试的演练场(靶机),为 web 安全爱好者和...

4.5K1

扫码关注云+社区