最近要用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的区别
在Unix/Linux下如果想让程序独立终端运行,一般都是使用 & 在命令结尾来让程序自动运行。(命令后可以不追加空格)
打开gnome-terminal,执行如下命令:
delectate@delectate:~$ totem &
[1] 8510
delectate@delectate:~$
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:~$
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:~$
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)
杀死已经启动的程序和普通方式一样:
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