• linux 程序管理


    bash和进程

    当我们首次连接到shell环境,或者执行bash命令的时候,都是在启动一个新的进程。启动者和被启动者是父子的关系。

    [root@localhost ~]# find / -name zjf &

    [root@localhost ~]# ps -l

    F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

    4 S 0 15873 15868 0 80 0 - 28977 wait pts/0 00:00:00 bash

    4 R 0 15964 15873 55 80 0 - 30752 - pts/0 00:00:03 find

    0 R 0 15965 15873 0 80 0 - 30316 - pts/0 00:00:00 ps

    fork and exec

    linux新建进程的方式是fork,fork会把父进程的内存空间拷贝一份(我的理解,应该是不包含变量)。然后拷贝的进程使用exec来加载自己要执行的代码。

    工作管理

    这一章节重点是记住将一个任务放到后台执行的方法。

    工作管理是针对一个shell环境下的工作任务的管理.可以让一个工作在后台运行,然后查看后台运行的任务,结束任务,前置任务等。

    • Ctrl-Z:该键是linux下面默认的挂起键(Suspend Key),当键入Ctrl-Z时,系统会将正在运行的程序挂起(注意是挂起,或者暂停),然后放到后台,同时给出用户相关的job信息。此时,程序并没有真正的停止,用户可以通过使用fg、bg命令将job恢复到暂停前的上下文环境,并继续执行。
    • Ctrl-C:该键是linux下面默认的中断键(Interrupt Key),当键入Ctrl-C时,系统会发送一个中断信号给正在运行的程序和shell。具体的响应结果会根据程序的不同而不同。一些程序在收到这个信号后,会立即结束并推出程序,一些程序可能会忽略这个中断信号,还有一些程序在接受到这个信号后,会采取一些其他的动作(Action)。当shell接受到这个中断信号的时候,它会返回到提示界面,并等待下一个命令。
    • Ctrl-D:该键是Linux下面标准输入输出的EOF。在使用标准输入输出的设备中,遇到该符号,会认为读到了文件的末尾,因此结束输入或输出。

    通过使用'&'操作符让Job在后台运行

    使用jobs命令,来查看当前系统中的Job

    bg:将后台暂停(挂起)的任务继续运行。如果不传入工作编号,那么会

    ctrl + Z和  bg命令的一般使用场景:如果你在运行job前,并不知道该job的运行情况,但在job运行了以后,发现这个是耗时的任务,并想将其放入到后台运行,这样你可以在这个任务运行的同时,完成一些其他的事情,那么你可以这样做:使用挂起键(Suspend Key,通常是Ctrl-Z)将该任务挂起(也就是暂停),然后使用'bg'命令在后台让该job恢复执行。

    [root@localhost /]# tar -czf usr.jar /usr &

    [root@localhost /]# tar -czf usr1.jar /usr

    ^Z(这里代表按了CTRL+Z)

    [2]+ 已停止 tar -czf usr1.jar /usr

    [root@localhost /]# bg

    [2]+ tar -czf usr1.jar /usr &

    [root@localhost /]# tar: 从硬连接目标中删除开头的"/"

    jobs

    [1]- 运行中 tar -czf usr.jar /usr &

    [2]+ 运行中 tar -czf usr1.jar /usr &

    使用'bg %job number'来指定你需要对哪一个job进行操作,这里'%'告诉系统后面的数字是一个job number(不要'%'可能也可以)。

    使用fg命令,将在后台的job换到前台

    当你需要将在后台的job换到前台时,使用'fg %job number'命令(也可以不要'%'也可以)。

    这里讲述的两种讲工作放到后台运行的方式,都是相当于把一个子进程放到后台,但是这个子进程是由父进程创建的,所以一旦关闭来父进程(如shell终端),那么后台运行的工作也会被kill。

    kill命令

    -2 类似于CTRL+C 发送终端终止

    -9 强制终止。

    -15 正常终止。这个是默认的。

    也就是说,我们正常使用kill ,如果不行可以使用-2,还不行才考虑使用-9.

    进程管理

    进程查看的命令比较杂乱,可以记常用的两个。

    ps -l :查看当前shell下的进程。

    ps aux:注意没有-,查看所有的线程。

    其中,ps -l和ps aux的输出大部分一样,不过每一列的名称完全不同。

    所以使用,我们查看ps -l的时候,可以查看有哪些进程在运行就够了。

    如果要看明细,可以使用ps aux | grep 来筛选。

    ps aux的例子:

    [root@localhost ~]# ps aux | head -n 5

    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

    root 1 0.0 0.2 52864 6716 ? Ss 16:43 0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 23

    root 2 0.0 0.0 0 0 ? S 16:43 0:00 [kthreadd]

    root 3 0.1 0.0 0 0 ? S 16:43 0:43 [ksoftirqd/0]

    root 5 0.0 0.0 0 0 ? S< 16:43 0:00 [kworker/0:0H]

    USER: 行程拥有者

    PID: pid

    %CPU: 占用的 CPU 使用率

    %MEM: 占用的记忆体使用率

    VSZ: 占用的虚拟内存大小

    RSS: 占用的物理内存(不包含虚拟内存)大小

    TTY: 启动进程的终端的次要装置号码 (minor device number of tty)

    STAT: 该行程的状态:

    START: 行程开始时间

    TIME: 执行的时间

    COMMAND:所执行的指令

    stat 中的参数意义如下:

    • D 不可中断 Uninterruptible(usually IO)
    • R 正在运行,或在队列中的进程
    • S 处于休眠状态
    • T 停止或被追踪
    • Z 僵尸进程
    • W 进入内存交换(从内核2.6开始无效)
    • X   死掉的进程

    pstree

    展示进程树

    [root@localhost ~]# pstree

    systemd─┬─ModemManager───2*[{ModemManager}]

    ├─NetworkManager───3*[{NetworkManager}]

    ├─2*[abrt-watch-log]

    ├─abrtd

    ├─accounts-daemon───2*[{accounts-daemon}]

    ├─alsactl

    ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}

    │ └─3*[{at-spi-bus-laun}]

    ├─at-spi2-registr───{at-spi2-registr}

    ├─atd

    ├─auditd─┬─audispd─┬─sedispatch

    │ │ └─{audispd}

    │ └─{auditd}

    ├─avahi-daemon───avahi-daemon

    ├─chronyd

    ├─colord───{colord}

    ├─crond

    ├─2*[dbus-daemon───{dbus-daemon}]

    ├─dbus-launch

    ├─dconf-service───2*[{dconf-service}]

    ├─firewalld───{firewalld}

    ├─gdm─┬─gdm-simple-slav─┬─Xorg───2*[{Xorg}]

    │ │ ├─gdm-session-wor─┬─gnome-session─┬─gnome-settings-───3*[{gnome-settings-}]

    │ │ │ │ ├─gnome-shell───6*[{gnome-shell}]

    │ │ │ │ └─3*[{gnome-session}]

    │ │ │ └─2*[{gdm-session-wor}]

    │ │ └─2*[{gdm-simple-slav}]

    │ └─2*[{gdm}]

    ├─goa-daemon───3*[{goa-daemon}]

    ├─ibus-daemon─┬─ibus-dconf───2*[{ibus-dconf}]

    │ ├─ibus-engine-sim───{ibus-engine-sim}

    │ └─2*[{ibus-daemon}]

    ├─ibus-x11───{ibus-x11}

    ├─iprdump

    ├─iprinit

    ├─iprupdate

    ├─ksmtuned───sleep

    ├─libvirtd───10*[{libvirtd}]

    ├─lsmd

    ├─lvmetad

    ├─mission-control───2*[{mission-control}]

    ├─mysqld_safe───mysqld───20*[{mysqld}]

    ├─polkitd───5*[{polkitd}]

    ├─pulseaudio───2*[{pulseaudio}]

    ├─rhsmcertd

    ├─rpc.statd

    ├─rpcbind

    ├─rsyslogd───2*[{rsyslogd}]

    ├─rtkit-daemon───2*[{rtkit-daemon}]

    ├─smartd

    ├─sshd─┬─sshd───bash

    │ └─sshd───bash───pstree

    ├─systemd-journal

    ├─systemd-logind

    ├─systemd-udevd

    ├─tuned───4*[{tuned}]

    ├─upowerd───2*[{upowerd}]

    └─vmtoolsd───{vmtoolsd}

    top命令

    使用方式

    top -d 2:展示系统各项指标的使用排名情况,这里默认为CPU的排名,每2秒刷新一次。

    在真个界面,可以按P查看cpu排名,按m切换为内存排名。

    查看内存使用情况

    free -g 以gb为单位展示

    free -m 以mb为单位展示

    [root@localhost ~]# free -m

    total used free shared buffers cached

    Mem: 2834 2755 79 8 0 1750

    -/+ buffers/cache: 1004 1830

    Swap: 2063 0 2063

    total:表示物理内存总量(total = used + free)
    used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
    free:未被分配的内存。
    shared:共享内存,一般系统不会用到,这里也不讨论。
    buffers:系统分配但未被使用的buffers 数量。
    cached:系统分配但未被使用的cache 数量。

     Mem:表示物理内存统计

    -/+ buffers/cache:表示物理内存的缓存统计

    used2:也就是第一行中的used – buffers-cached 也是实际使用的内存总量。 //used2为第二行
    free2= buffers1 + cached1 + free1 //free2为第二行、buffers1等为第一行
    free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。

    Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。一旦内存不足,Swap的used就会比较大。

    如何识别内存不足:free2很少 或者 Swap的used比较大。

    netstat

    常见参数

    -a (all)显示所有选项,默认不显示LISTEN相关
    -t (tcp)仅显示tcp相关选项
    -u (udp)仅显示udp相关选项
    -n 拒绝显示别名,能显示数字的全部转化成数字。
    -l 仅列出有在 Listen (监听) 的服務状态

    -p 显示建立相关链接的程序名
    -r 显示路由信息,路由表
    -e 显示扩展信息,例如uid等
    -s 按各个协议进行统计
    -c 每隔一个固定时间,执行该netstat命令。

    常见使用:

    netstat -tap查看所有的tcp:

    [root@localhost ~]# netstat -tap

    Active Internet connections (servers and established)

    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

    tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN 1929/rpcbind

    tcp 0 0 0.0.0.0:17046 0.0.0.0:* LISTEN 2242/rpc.statd

    tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN 1817/sshd

    tcp 0 0 zjf-pc:ssh 192.168.1.7:53037 ESTABLISHED 5678/sshd: root@pts

    tcp 0 52 zjf-pc:ssh 192.168.1.7:56682 ESTABLISHED 8008/sshd: root@pts

    tcp6 0 0 [::]:mysql [::]:* LISTEN 2535/mysqld

    tcp6 0 0 [::]:sunrpc [::]:* LISTEN 1929/rpcbind

    tcp6 0 0 [::]:unisys-eportal [::]:* LISTEN 2242/rpc.statd

    tcp6 0 0 [::]:ssh [::]:* LISTEN 1817/sshd

     

    netstat -a查看所有占用的端口:

    [root@localhost ~]# netstat -a

    Active Internet connections (servers and established)

    Proto Recv-Q Send-Q Local Address Foreign Address State

    tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN

    tcp 0 0 0.0.0.0:17046 0.0.0.0:* LISTEN

    tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN

    tcp 0 0 zjf-pc:ssh 192.168.1.7:53037 ESTABLISHED

    tcp 0 52 zjf-pc:ssh 192.168.1.7:56682 ESTABLISHED

    tcp6 0 0 [::]:mysql [::]:* LISTEN

    tcp6 0 0 [::]:sunrpc [::]:* LISTEN

    tcp6 0 0 [::]:unisys-eportal [::]:* LISTEN

    tcp6 0 0 [::]:ssh [::]:* LISTEN

    udp 0 0 0.0.0.0:sunrpc 0.0.0.0:*

    udp 0 0 0.0.0.0:ntp 0.0.0.0:*

    udp 0 0 localhost:323 0.0.0.0:*

    udp 0 0 0.0.0.0:passgo-tivoli 0.0.0.0:*

    udp 0 0 localhost:722 0.0.0.0:*

    udp 0 0 0.0.0.0:38078 0.0.0.0:*

    udp 0 0 0.0.0.0:mdns 0.0.0.0:*

    udp 0 0 0.0.0.0:22422 0.0.0.0:*

    udp6 0 0 [::]:sunrpc [::]:*

    udp6 0 0 [::]:ntp [::]:*

    udp6 0 0 localhost:323 [::]:*

    udp6 0 0 [::]:passgo-tivoli [::]:*

    udp6 0 0 [::]:56300 [::]:*

    raw6 0 0 [::]:ipv6-icmp [::]:*

    service

    Service是一种被称为守护进程(daemon)的程序。它通常一旦启动后就在后台持续运行,通常在等待什么输入或者监控系统有什么变化。例如Apache服务器有一个叫httpd的守护进程监听80端口以等待http请求。

     linux提供了一个名叫daemon的函数来初始化环境,如下:

                  int daemon(int nochdir, int noclose);

    使用该函数需加入#include <stdlib.h>头文件包含。调用该函数之后,其后的程序将会以daemon方式运行。

    编写自己的service脚本如下,然后在/etc/init.d目录下,存储这个脚本为mysqltest文件。

    start(){

    n=$(netstat -ntlp |grep 3307|grep -v "grep 3307"|wc -l)

    if [ $n -ne 0 ];then

    echo"server is already running!"

    exit0

    fi

    mysqld_multi --defaults-extra-file=/etc/my_3307.cnf --user=root start 3307

    if [ $? -eq 0 ];then

    echo"service mysql_3307 start successful "

    else

    echo"service mysql_3307 start fail"

    fi

    }

     

    stop(){

    n=$(netstat -ntlp |grep 3307|grep -v "grep 3307"|wc -l)

    if [ $n -eq 0 ];then

    echo"server is not running!"

    fi

    mysqld_multi --defaults-extra-file=/etc/my_3307.cnf --user=root stop 3307

    if [ $? -eq 0 ];then

    echo"service mysql_3307 stop successful "

    else

    echo"service mysql_3307 stop fail"

    fi

    }

     

    status(){

    ps -ef |grep 3307|grep -v "grep 3307"

    }

     

    case$1in

    start)

    start

    ;;

    stop)

    stop

    ;;

    status)

    status

    ;;

    *)

    echo'service accept arguments start|stop|status'

    esac

    然后就能使用service mysqltest start|stop|restart命令了。

  • 相关阅读:
    普通javaBean获取Spring托管对象
    java 线程安全问题
    MySQL之alter语句用法总结
    Maven pom.xml配置
    Srping框架初识
    win7(64位)下memcache安装时报错“ failed to install service or service already installed”
    activemq 使用
    elasticsearch plugin
    logback.xml 实例
    Intellij IDEA 插件
  • 原文地址:https://www.cnblogs.com/xiaolang8762400/p/7384952.html
Copyright © 2020-2023  润新知