linux 服务后台,linux查看java进程

大家好,感谢邀请,今天来为大家分享一下linux 服务后台的问题,以及和linux查看java进程的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

如何编写Linux Daemon后台程序

守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。 \x0d\x0a守护进程的编程本身并不复杂,复杂的是各种版本的Unix的实现机制不尽相同,造成不同Unix环境下守护进程的编程规则并不一致。这需要读者注意,照搬某些书上的规则(特别是BSD4.3和低版本的System V)到Linux会出现错误的。下面将全面介绍Linux下守护进程的编程要点并给出详细实例。 \x0d\x0a一.守护进程及其特性 \x0d\x0a守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端,会话和进程组,工作目录以及文件创建掩模等。这些环境通常是守护进程从执行它的父进程(特别是shell)中继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,可以由作业规划进程crond启动,还可以由用户终端(通常是shell)执行。 \x0d\x0a总之,除开这些特殊性以外,守护进程与普通进程基本上没有什么区别。因此,编写守护进程实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程。如果读者对进程有比较深入的认识就更容易理解和编程了。 \x0d\x0a二.守护进程的编程要点 \x0d\x0a前面讲过,不同Unix环境下守护进程的编程规则并不一致。所幸的是守护进程的编程原则其实都一样,区别在于具体的实现细节不同。这个原则就是要满足守护进程的特性。同时,Linux是基于Syetem V的SVR4并遵循Posix标准,实现起来与BSD4相比更方便。编程要点如下; \x0d\x0a1.在后台运行。 \x0d\x0a为避免挂起控制终端将Daemon放入后台执行。方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行。 \x0d\x0aif(pid=fork()) \x0d\x0aexit(0);//是父进程,结束父进程,子进程继续 \x0d\x0a2.脱离控制终端,登录会话和进程组 \x0d\x0a有必要先介绍一下Linux中的进程与控制终端,登录会话和进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)。登录会话可以包含多个进程组。这些进程组共享一个控制终端。这个控制终端通常是创建进程的登录终端。 \x0d\x0a控制终端,登录会话和进程组通常是从父进程继承下来的。我们的目的就是要摆脱它们,使之不受它们的影响。方法是在第1点的基础上,调用setsid()使进程成为会话组长: \x0d\x0asetsid(); \x0d\x0a说明:当进程是会话组长时setsid()调用失败。但第一点已经保证进程不是会话组长。setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。由于会话过程对控制终端的独占性,进程同时与控制终端脱离。 \x0d\x0a3.禁止进程重新打开控制终端 \x0d\x0a现在,进程已经成为无终端的会话组长。但它可以重新申请打开一个控制终端。可以通过使进程不再成为会话组长来禁止进程重新打开控制终端: \x0d\x0aif(pid=fork()) \x0d\x0aexit(0);//结束第一子进程,第二子进程继续(第二子进程不再是会话组长) \x0d\x0a4.关闭打开的文件描述符 \x0d\x0a进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误。按如下方法关闭它们: \x0d\x0afor(i=0;i关闭打开的文件描述符close(i);> \x0d\x0afor(i=0;i \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0avoid init_daemon(void) \x0d\x0a{ \x0d\x0aint pid; \x0d\x0aint i; \x0d\x0a\x0d\x0aif(pid=fork()) \x0d\x0aexit(0);//是父进程,结束父进程 \x0d\x0aelse if(pid \x0d\x0a#include \x0d\x0avoid init_daemon(void);//守护进程初始化函数 \x0d\x0amain() \x0d\x0a{ \x0d\x0aFILE*fp; \x0d\x0atime_t t; \x0d\x0ainit_daemon();//初始化为Daemon \x0d\x0awhile(1)//每隔一分钟向test.log报告运行状态 \x0d\x0a{ \x0d\x0asleep(60);//睡眠一分钟 \x0d\x0aif((fp=fopen("test.log","a"))>=0) \x0d\x0a{ \x0d\x0at=time(0); \x0d\x0afprintf(fp,"I'm here at%sn",asctime(localtime(&t))); \x0d\x0afclose(fp); \x0d\x0a} \x0d\x0a} \x0d\x0a} \x0d\x0a以上程序在RedHat Linux6.0下编译通过。步骤如下: \x0d\x0a编译:gcc _g _o test init.c test.c \x0d\x0a执行:./test \x0d\x0a查看进程:ps _ef \x0d\x0a从输出可以发现test守护进程的各种特性满足上面的要求。

linux下如何监听进程

一、supervise

Supervise是daemontools的一个工具,可以用来监控管理unix下的应用程序运行情况,在应用程序出现异常时,supervise可以重新启动指定程序。

使用:

mkdir test

cd test

vim run写入希望执行的操作

supervise test(注意这里是的参数是run文件上层的文件夹,改变run的为可执行 chmod+x run)

二、monit

monit是一个小型的开放源码工具来管理和监控Unix系统。Monit可以自动维护进程,及时避免进程异常退出等产生的问题。

系统: monit可以监控问题的发生,包括进程状态、系统cpu负载、内存占用情况等,例如当apache服务的cpu负载以及内存闸弄情况过高时候,它会重启apache服务。

进程: monit可以监控守护进程,包括系统进程。例如当某个进行down掉,它会自动恢复重启该进程。

文件系统:Monit可以监控本地文件、目录、文件系统的变化,包括时间戳、校验值、大小的变化。例如,可以监控文件sha1以及md5的值,来监控文件是否发生变化。

网络:monit可以监控网络连接,支持TCP、UDP、Unix domain sockets以及HTTP、SMTP等。

定时脚本:monit可以用来定时测试程序和脚本,获取程序输出结果,进而判断是否成功或其他情况。

安装:

sudo apt-get install monit

编辑配置:

sudo vim/etc/monit/monitrc

启动、停止、重启:

sudo/etc/init.d/monit start

sudo/etc/init.d/monit stop

sudo/etc/init.d/monit restart

设置页面监控状态:

set httpd port 2812 and

allow 0.0.0.0/0.0.0.0

allow localhost

增加监控:

需要注意的是,这里需要添加start和stop,缺一个都是不行的

1.根据程序名称来监控

check process test with MATCHING test.py

start program="/home/yxd/test.py"

stop program="xxxxx"

2.根据pid监控

check process apache with pidfile/var/run/httpd.pid

start program="/etc/init.d/rcWebServer.sh start https"

stop program="/etc/init.d/rcWebServer.sh stop https"

if changed pid then aler

参考:用monit监控系统关键进程

supervisord

Supervisor是一个C/S系统,它可以在类unix操作系统让用户来监视和控制后台服务进程的数量。它是由python编写的,常用于进程异常退出的重启保护。

安装:

pip install supervisor

查看配置文件:

echo_supervisord_conf

从该命令的结果中,可以看到各个模块的配置信息。

创建配置文件:

echo_supervisord_conf>/etc/supervisord.conf

配置应用:

[program:test]

command=python/root/test_supervisor.py

process_name=%(program_name)s

stdout_logfile=/root/test.log

stderr_logfile=/root/test.log

保存,启动:

/usr/bin/supervisord-c/etc/supervisord.conf

Linux守护进程详解

在Linux服务器实际应用中,经常会有需要长时间执行的任务。这类任务若在前台运行,用户无法进行其他操作或者断开与服务器的连接,否则任务将被中止。此时适合使用守护进程。为了使用守护进程,需要了解Linux前台、后台、守护进程的概念与使用,本文将对此进行讲解。

可以看出,”后台任务”与”前台任务”的重要区别:是否继承标准输入。所以,执行后台任务的同时,用户还可以输入其他命令。

为了理解守护任务为何在结束session时也不退出,需要先了解Linux下退出session时发生的操作。

Session退出时,linux系统设计如下:

前台任务会随着session的退出而退出是因为它收到了 SIGHUP信号。

后台任务是否会受到SIGNUP信号,取决于shell的 huponexit参数。可以通过$ shopt| grep huponexit查看该参数的值。大多数Linux系统,这个参数默认关闭(off)。因此,session退出的时候,不会把SIGHUP信号发给”后台任务”,即此时的后台任务是守护进程,但这显然不够安全。并不保险,因为有的系统的 huponexit参数可能是打开的(on)状态。

更保险的方法是使用 disown命令。它可以将指定任务从”后台任务”列表(jobs命令的返回结果)之中移除。一个”后台任务”只要不在这个列表之中,session就肯定不会向它发出SIGHUP信号。

执行上面的命令以后, server.js进程就被移出了”后台任务”列表。你可以执行 jobs命令验证,输出结果里面,不会有这个进程。

但是,这样还存在问题。因为”后台任务”的标准 I/O继承自当前 session, disown命令并没有改变这一点。一旦”后台任务”读写标准 I/O,就会发现它已经不存在了,所以就报错终止执行。为了解决这个问题,需要对”后台任务”的标准 I/O进行重定向。

这样基本上就没有问题了。

注:

/dev/null文件的作用

这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。

所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里

nohup命令对server.js进程做了三件事。

阻止SIGHUP信号发到这个进程。

关闭标准输入。该进程不再能够接收任何输入,即使运行在前台。

重定向标准输出和标准错误到文件nohup.out。

也就是说,nohup命令实际上将子进程与它所在的 session分离了。注意,nohup命令不会自动把进程变为”后台任务”,所以必须加上&符号

守护进程创建方法:

方法一:

方法二:

方法三:

fg、bg、jobs、&、nohup、ctrl+z、ctrl+c命令

一、&

加在一个命令的最后,可以把这个命令放到后台执行,如:

二、ctrl+ z

可以将一个正在前台执行的命令放到后台,并且处于暂停状态。

CTRL+Z和 CTRL+C的对比

CTRL+Z和 CTRL+C都是中断命令,但是他们的作用却不一样.

CTRL+C是强制中断程序的执行,而 CTRL+Z的是将任务中断,但是此任务并没有结束,仍然在进程中,只是维持挂起的状态,用户可以使用 fg/bg操作继续前台或后台的任务。

三、jobs

查看当前有多少在后台运行的进程

jobs-l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell从当前的shell环境已知的列表中删除任务的进程标识。

四、fg

将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg%jobnumber(jobnumber是命令编号,不是进程号)将选中的命令调出。

五、bg

将一个在后台暂停的命令,变成在后台继续执行。

如果后台中有多个命令,可以用 bg%jobnumber将选中的命令调出。

六、kill

方法1:通过jobs命令查看job号(假设为num),然后执行

方法2:通过ps命令查看job的进程号(PID,假设为pid),然后执行

前台进程的终止:Ctrl+c

七、nohup

如果想让程序即使在关闭当前的终端后也始终在后台执行(之前的&做不到),需要使用nohup命令。

nohup命令可以在你退出帐户/关闭终端之后继续运行相应的进程。

关闭终端后,在另一个终端jobs已经无法看到后台跑的程序了,此时利用ps(进程查看命令)查看进程。

阅读剩余
THE END