精华内容
下载资源
问答
  • 运行指定的命令,如果在指定时间后仍在运行,则杀死该进程。用来控制程序运行的时间。 使用方法 timeout [选项] 数字[后缀] 命令 [参数]... 后缀”s”代表秒(默认值),”m”代表分,”h”代表小时,”d”代表...

    运行指定的命令,如果在指定时间后仍在运行,则杀死该进程。用来控制程序运行的时间。

    使用方法

    timeout [选项] 数字[后缀] 命令 [参数]...
    


    后缀”s”代表秒(默认值),”m”代表分,”h”代表小时,”d”代表天。

    选项详解
    长选项必须使用的参数对于短选项时也是必需使用的。
      -s, --signal=信号
            指定在超时时发送的信号。信号可以是类似"HUP"的信号名或是信号数。
            查看"kill -l"以获得信号列表
          --help        显示此帮助信息并退出
          --version        显示版本信息并退出

    如果程序超时则退出状态数为124,否则返回程序退出状态。
    如果没有指定信号则默认为TERM 信号。TERM 信号在进程没有捕获此信号时杀死进程。
    对于另一些进程可能需要使用KILL (9)信号,当然此信号不能被捕获。

    示例

    timeout 10 php test.php
    

    解释:如过php test.php命令在10秒内结束,则平安结束,运行超过10秒,将被强行kill掉。

    展开全文
  • (1)等待作业号或者进程号的退出(和&命令搭配使用),返回最后一个作业或进程的退出状态。如果没有指定参数,则等待所有子进程的退出,其退出状态为0. (2)如果是shell中使用wait,不会等待shell函数中调用...

    1.介绍

    (1)等待作业号或者进程号的退出(和&命令搭配使用),返回最后一个作业或进程的退出状态。如果没有指定参数,则等待所有子进程的退出,其退出状态为0.

    (2)如果是shell中使用wait,不会等待shell函数中调用的后台进程。在shell函数中使用wait,则只等待函数中启动的后台进程。

    (3)在shell中使用wait命令不跟参数,相当于是多线程,等待全部线程执行完毕才执行后续命令。

     

    2.语法

    wait [进程号或作业号]

    如果wait后面不带任何的进程号或作业号,那么wait会直至当前shell中进程的所有子进程都执行结束后,才继续执行下一步。

    wait 23
    wait %1

     

    3.实例

    (1)使用wait等待所有后台进程结束

    # 等待10秒后,退出

    #!/bin/bash
    sleep 10 &
    sleep 5 &
    wait

    (2)wait等待一个后台进程

    # $!表示上个子进程的进程号,wait等待一个子进程,等待5秒后,退出

    #!/bin/bash
    sleep 10 &
    sleep 5 &
    wait $!

    (3)shell脚本,使用wait控制进程超时时间,kill进程

    #!/bin/bash
    
    # 等待时间,单位:s
    wait_for=3
    
    # 执行的命令
    command=$*
    ${command} &
    command_pid=$!
    (sleep ${wait_for} ; kill -9 ${command_pid} > /dev/null 2>&1) &
    watch_dog=$!
    sleep_pid=$PPID
    wait ${command_pid} > /dev/null 2>&1
    kill ${sleep_pid} > /dev/null 2>&1

    (4)shell脚本,使用多线程例子

    一个for循环1000次,循环体里面的每个任务都放入后台运行(在命令后面加&符号代表后台运行)

    #!/bin/bash
    
    start_time=$(date +%s)
    
    for ((i=1;i<=1000;i++))
    do
    {
    # 该命令是用来测试的命令,此处为实际执行的命令
    sleep 5s
    echo "$i"
    } &
    # 用{}把循环体括起来,后加一个&符号,代表每次循环都把命令放入后台运行,一旦放入后台,就意味着{}里面的命令交给操作系统的一个线程处理了,循环了1000次,就有1000个&把任务放入后台,操作系统会并发1000个线程来处理
    done
    
    # 等待1000个后台任务全都执行完成之后,再继续执行执行脚本
    wait 
    
    end_time=$(date +%s) 
    echo "TIME:$(expr $end_time- $start_time)"
    
    

     

    展开全文
  • Linux进程标识方法

    千次阅读 2019-10-31 08:13:05
    1. 进程描述符 2. 进程标识符 3. Linux进程的用户 4. 进程标识的获取实例

    在 Linux 中有很多进程在同时运行,可以使用两种方式对这些进程进行标识:

    • 进程描述符的地址
    • 进程标识符

    对于当前操作系统中的每个独立进程来说,其对应的进程描述符的地址以及进程标识符都是唯一的。

    1. 进程描述符

    为了对进程进行管理,Linux 内核必须了解每个进程当前的执行状态,这些状态包括进程的优先级、进程的运行状态、进程分配的地址空间等。因此,Linux 内核提供了一个 task_struct 类型的结构体进程描述符(process descriptor)来存放这些相关信息。

    Linux 内核提供了一个数组 task 用于存放进程描述符,其包含指向系统中所有 task_struct 结构的指针。系统中的最大进程数目受 task 数组大小的限制,缺省值一般为 512。

    创建新进程时,Linux 将从系统内存中分配一个 task_struct 结构并将其加入 task 数组。当前运行进程的结构用 current 指针来指示。

    以下是一个进程描述符的主要结构及其说明:

    struct task struct 
    {
        yolatile long state;
        //进程的运行时状态,-1代表不可运行,0代表可运行,>0代表已停止。    
        unsigned int flags;    
        //flags 是进程当前的状态标识,具体说明如下:    
        //0x00000002 表示进程正在被创建    
        //0x00000004 表示进程正准备退出    
        //0x00000040 表示此进程被 fork 出,但是并没有执行 exec    
        //0x00000400 表示此进程由于其他进程发送相关信号而被杀死    
        unsigned int rt_priority;    
        //进程的运行优先级    
        truct list_head tasks;    
        //list_head 结构体    
        struct mm_struct *mm;    
        //内存使用的相关情况    
        int exit_state;    
        int exit_code, exit_signal;    
        pid_t pid;    
        //进程标识号    
        pid_t tgid;    
        //进程组号    
        struct task_struct *real_parent;    
        //real_parent 是该进程的“亲生父亲”,不管其是否被 “寄养”    
        struct task_struct *parent;    
        //parent 是该进程现在的父进程,有可能是“继父”    
        struct list_head children;      
        //children 指的是该进程孩子的链表,可以得到所有子进程的进程描述符    
        struct list_head sibling;      
        //sibling 是该进程兄弟的链表,也就是其父亲的所有孩子的链表,用法与 children 相似          
        struct task_struct *group_leader;    
        //主线程的进程描述符    
        struct list_head thread_group;    
        //进程所有线程的链表    
        处理器 time_t utime, stime;    
        //进程相关时间    
        struct timespec start_time;    
        struct timespec real_ start_time;    
        //进程启动时间    
        char comm[TASK_COMM_LEN];    
        //这个是该进程所有线程的链表    
        int link_count, total_link_count;    
        //文件系统信息计数    
        struct thread_struct thread;    
        //特定处理器下的状态    
        struct fs_struct *fs;    
        //文件系统相关信息结构体    
        struct files_struct * files;    
        //打开的文件相关信息结构体    
        struct signal_struct *signal;    
        struct sighand_struct sighand;    
        //信号相关信息的句柄    
        unsigned long timer_slack_ns;    
        unsigned long default_timer_slack_ns;    
        //松弛时间值,用来规定 select() 和 poll() 的超时时间,单位是纳秒
    };

    2. 进程标识符

    进程标识符(Process ID)是进程描述符中最重要的组成部分,是在当前 Linux 系统中唯一的一个非负整数,用于标识和对应唯一的进程。

    Linux 内核使用了一个数据类型 pid_t 来存放进程的进程标识符,这个数据类型的实质是一个32位的无符号整型数据。进程标识符被顺序编号,通常来说是前一个进程的进程标识符的值加1。进程标识符可以重复使用,当一个进程被回收之后,过一段时间其标识符又可以被再次使用。Linux 内核上通常允许使用的进程标识符是 0~32767。

    在Linux中,有几个特殊的进程标识符所对应的进程。

    • 进程标识符0:对应的是交换进程(swapper),用于执行多进程的调用。
    • 进程标识符1:对应的是初始化进程(init),在自举过程结束时由内核调用,对应的文件是/sbin/init,负责 Linux 的启动工作,这个进程在系统运行过程中是不会终止的,可以说当前操作系统中的所有进程都是这个进程衍生而来的。
    • 进程标识符2:可能对应页守护进程(pagedaemon),用于虚拟存储系统的分页操作。

    使用命令 ps -aux 可以查看系统中当前正在运行的进程的进程标识符以及其他一些信息。

    可以使用 getpid 系列函数来获得当前进程的进程标识符。

    #include <sys/types.h>
    #include <unistd.h>
    pid_t getpid(void);
    pid_t getppid(void);
    • getpid 函数用于获得当前调用进程的进程标识符。
    • getppid 用于获得当前调用进程的父进程的进程标识符。

    3. Linux进程的用户

    进程也有对应的实际用户ID、实际组ID、有效用户ID、有效组ID,对于这些用户而言,每个进程同样存在一个相应的标识符,Linux 提供了相应的函数用于获取这些标识符。

     #include <unistd.h>
     #include <sys/types.h>
     uid_t getuid(void);
     uid_t geteuid(void);
     gid_t getgid(void);
     gid_t getegid(void);
    • getuid:返回进程的实际用户标志符。

    • geteuid:返回调用进程的有效用户标识符。

    • getgid:返回调用进程的实际组标识符。

    • getegid:返回调用进程的有效组标识符。

    4. 进程标识的获取实例

    展开全文
  • Linux中Kill进程的N种方法

    万次阅读 2018-08-09 12:50:26
    linux进程管理手段丰富。想怎么杀进程都可以。废话少说,正题开始: 常规篇: 首先,用ps查看进程,方法如下: $ ps -ef 或者: $ ps -aux 此时如果我想杀了火狐的进程就在终端输入: $ kill -s 9 ...

    linux的进程管理手段丰富。想怎么杀进程都可以。废话少说,正题开始:

    常规篇:

    首先,用ps查看进程,方法如下:

    $ ps -ef

    或者:

    $ ps -aux

    此时如果我想杀了火狐的进程就在终端输入:

    $ kill -s 9 1827


    其中-s 9 制定了传递给进程的信号是9,即强制、尽快终止进程。各个终止信号及其作用见附录。

    1827则是上面ps查到的火狐的PID。

    简单吧,但有个问题,进程少了则无所谓,进程多了,就会觉得痛苦了,无论是ps -ef 还是ps -aux,每次都要在一大串进程信息里面查找到要杀的进程,看的眼都花了。

    进阶篇:

    改进1:

    把ps的查询结果通过管道给grep查找包含特定字符串的进程。管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。

    $ ps -ef | grep firefox
    
    smx 1827 1 4 11:38 ? 00:27:33 /usr/lib/firefox-3.6.18/firefox-bin
    
    smx 12029 1824 0 21:54 pts/0 00:00:00 grep --color=auto firefox

     

    这次就清爽了。然后就是

    $kill -s 9 1827

    还是嫌打字多?

    改进2——使用pgrep:

    一看到pgrep首先会想到什么?没错,grep!pgrep的p表明了这个命令是专门用于进程查询的grep。

    $ pgrep firefox
    
    1827

    看到了什么?没错火狐的PID,接下来又要打字了:

    $kill -s 9 1827

    改进3——使用pidof:

    看到pidof想到啥?没错pid of xx,字面翻译过来就是 xx的PID。

    $ pidof firefox-bin
    
    1827

    和pgrep相比稍显不足的是,pidof必须给出进程的全名。然后就是老生常谈:

    $kill -s 9 1827

    无论使用ps 然后慢慢查找进程PID 还是用grep查找包含相应字符串的进程,亦或者用pgrep直接查找包含相应字符串的进程PID,然后手动输入给 kill 杀掉,都稍显麻烦。有没有更方便的方法?有!

    改进4:

    $ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9

    说明:

    “grep firefox”的输出结果是,所有含有关键字“firefox”的进程。

    “grep -v grep”是在列出的进程中去除含有关键字“grep”的进程。

    “cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID。

    “xargs kill -s 9”中的xargs命令是用来把前面命令的输出结果(PID)作为“kill -s 9”命令的参数,并执行该命令。“kill -s 9”会强行杀掉指定进程。

    难道你不想抱怨点什么?没错太长了

    改进5:

    知道pgrep和pidof两个命令,干嘛还要打那么长一串!

    $ pgrep firefox | xargs kill -s 9

    改进6:

    $ ps -ef | grep firefox | awk '{print $2}' | xargs kill -9
    
    kill: No such process

    有一个比较郁闷的地方,进程已经正确找到并且终止了,但是执行完却提示找不到进程。

    其中awk '{print $2}' 的作用就是打印(print)出第二列的内容。根据常规篇,可以知道ps输出的第二列正好是PID。就把进程相应的PID通过xargs传递给kill作参数,杀掉对应的进程。

    改进7:

    难道每次都要调用xargs把PID传递给kill?答案是否定的:

    $kill -s 9 `ps -aux | grep firefox | awk '{print $2}'`

    改进8:

    没错,命令依然有点长,换成pgrep。

    $kill -s 9 `pgrep firefox`

    改进9——pkill:

    看到pkill想到了什么?没错pgrep和kill!pkill=pgrep+kill。

    $pkill -9 firefox

    说明:"-9" 即发送的信号是9,pkill与kill在这点的差别是:pkill的信号直接跟在 “-“ 后面,“-sxx”不是用来传递信号。之前我一直以为是 "-s 9",结果每次运行都无法终止进程。

    改进10——killall:

    killall和pkill是相似的,不过如果给出的进程名不完整,killall会报错。pkill或者pgrep只要给出进程名的一部分就可以终止进程。

    $killall -9 firefox

     

    总结:

    1、

    1)kill传递给要终止的进程的信号,实际上是POSIX信号,它们在signal.h里面定义附录摘录了部分POSIX信号,及其相关说明。支持两种方式传递终止信号:

    kill -s signal PID
    比如
    $ kill -s 9 1234

     

    (2)kill -signal PID

    $kill -9 1234

    2)kill传递的信号也支持两种表示方式:信号名和信号数:

    kill -s 9 1234 和kill -s KILL 1234 (SIGKILL)

    kill -15 1234 和kill -TERM 1234 (SIGTERM)

    当然其他信号也可以这样表示。

    2、

    上面各种改进方法,设计到的技巧,有两个在其他地方也有借鉴意义。

    1)、进程号的获取部分

    用awk提取第2列或者用cut提取第8-15个字母。其他地方也可一用awk提取第n列,或者用cut提取第m-第n哥字母。

    2)、进程号的传递

    用xargs把进程号传递给后面的kill做参数运行;

    直接用两个“`”(“~”下面那个后单引号)把命令放到对应参数的位置来传递参数。

    附录:各种信号及其用途

    信号描述Linux x86[1] 的信号数
    SIGABRT进程退出6
    SIGALRM计时器到时14
    SIGBUS总线错误,进入内存对象未定义部分7
    SIGCHLD子进程终止,停止或继续17
    SIGCONT继续,如果停止18
    SIGFPE浮点指针异常,错误的算数操作。8
    SIGHUP挂起1
    SIGILL非法指令4
    SIGINT中断2
    SIGKILL杀死(尽快终止)9
    SIGPIPE无读操作时写入管道。13
    SIGQUIT退出并转储核心3
    SIGSEGV段非法11
    SIGSTOP临时停止执行19
    SIGTERM终止(要求终止)15
    SIGTSTP由信号终止20
    SIGTTIN后台进程试图从TTY 读入 ("in")21
    SIGTTOU后台进程试图写入TTY ("out")22
    SIGUSR1用户定义110
    SIGUSR2用户定义212
    SIGPOLLPollable event29
    SIGPROF统计分布图用计时器到时27
    SIGSYS不良的系统调用31
    SIGTRAP跟踪/断点 陷阱5
    SIGURGI/O紧急信号,套接字紧急数据有效23
    SIGVTALRM虚拟定时器超时26
    SIGXCPU超出CPU时间限制24
    SIGXFSZ超出文件大小限制25
    展开全文
  • Linux初学者面试问题 Linux基本面试问题 1.什么是Linux? 回答:Linux是基于Linux内核的操作系统。它是一个开源操作系统,可以在不同的硬件平台上运行。它为用户提供了免费的低成本操作系统。这是一个用户友好的...
  • 编写一个程序,用Linux中的IPC机制中的管道完成两个进程进行石头、剪子、布的游戏。 可以创建三个进程,其中,一个进程为裁判进程,另外两个进程为选手进程。可以将石头、剪子、布这三招定义为三个整型值。胜负关系...
  • Linux进程对于子进程的异步等待

    千次阅读 2017-06-27 16:59:27
     首先,打开Linux虚拟机或者系统的时候,系统自己建立一个init进程,这是Linux系统的基础进程,然后init进程再根据一些配置文件决定创建哪些进程,或者我们在终端自己创建一个新进程的时候,如果你有时间,你可以...
  • 问题背景:工作中遇到一个多线程进程有部分线程(包含主线程)像卡死一样不再处理其他事件,就像无限期休眠了一样 知识点:进程、线程、线程锁、条件变量、socket 定位工具:strace、htop、gdb 问题分析: 由于...
  • Linux网络编程】超时检测

    千次阅读 2017-04-11 20:30:16
    在网络编程中超时检测是一个比较常见的操作,因为网络连接具有很大的不确定性,而很多网络操作函数默认都是阻塞式的,因此如果不设置超时,可能会造成永久等待状态出现。 设置套接字选项setsockopt【注意】如果程序...
  • LinuxLinux进程信号详解

    万次阅读 2018-04-22 18:04:44
    1、当用户按下这一对组合键时,这个键盘输入会产生一个硬件中断,如果CPU正在执行这个进程的代码时,则该进程的用户代码先暂停执行,用户从用户态切换到内核态处理硬件中断2、终端驱动程序将这一对组合键翻译成一个...
  • 在某些情况下,我们需要限制程序的运行时间(比如cronjob等),这里简单介绍下使用信号及timeout的实现方法 1. 假如有如下代码(test_timout.sh): #!/bin/bash while true ...一旦运行后(bash t...
  • linux环境下,在进程间通信时,比如“消息队列”,一般是没有超时处理的接口的,要不就是去接收,接收不到就一直死等,直到有数据过来才返回,要不就是去接收时,发现没有数据,则立即返回; 现在想实现让他去...
  • Qt编写守护进程

    2019-03-02 14:56:06
    本篇文章提供一个软件实现守护进程的办法,原理就是udp通信,单独写个守护进程程序,专门负责检测主程序是否存在,不存在则启动。主程序只需要启动live类监听端口,收到hello就回复ok就行。 为了使得兼容任意程序,...
  • 最近一段时间,我刚刚进入一家新公司,并接手了这里的一个站点,由于这个站点的架构设计不太合理,导致MySQL的压力始终很大,经常出现超时的Locked进程,于是编写了一段Linux的Shell脚本来定时kill掉这些进程。...
  • Linux驱动获取进程PID和进程名字

    千次阅读 2017-10-31 11:23:17
    Linux驱动打印进程PID和进程名字在内核中, 进程用task_struct结构表示, 其中有char comm[TASK_COMM_LEN]成员, 其含义是 executable name excluding path 按照标准做法, 应该使用get_task_comm()/set_task_comm()...
  • Linux进程通信

    千次阅读 2019-05-03 16:41:09
    信号是Linux进程间异步通信的唯一机制,用于通知进程一个特定的事件并强迫进程执行对应的处理程序,如用户在键盘上按crtl+c,内核会给当前控制台上正在运行的进程发送一个SIGINT的信号,进程收到该信号执行默认处理...
  • Linux进程信号

    千次阅读 2018-06-04 18:57:34
    当内核检测到某种软件条件发⽣时也可以通过信号通知进程,例如闹钟超时产⽣SIGALRM信号,向读端已关闭的管道写数据时产⽣SIGPIPE信号。如果不想按默认动作处理信号,⽤户程序可以调⽤sigaction(2)函数告诉内核如何处理...
  • Linux C多进程编程基础

    千次阅读 2018-08-20 23:15:51
    关于进程概念相关的内容请打开链接,本文所介绍的是进程的POSIX标准。...其中PID为1的进程是初始化进程init,Linux中的所有进程都是由其衍生而来的,在shell下执行程序启动的进程则是shell进程的子进...
  • Linux平台C++监控子进程程序

    千次阅读 2017-04-07 10:26:09
    这里描述另一种方法:服务进程分离为主监控进程和子工作进程,主进程只负责监控子进程(停止、拉起子进程等),子进程负责对外提供服务。监控子进程的程序,个人认为重点如下: 子进程收到终止信号后,完成自身善后...
  • linux进程的信号量

    千次阅读 2017-03-16 23:47:04
    linux进程的信号量信号: 信号的基本概念 信号与异常处理 信号的处理方法 信号的可靠性 函数可重入性 信号集 信号屏蔽 首先来介绍一下什么是信号,信号的基本概念:1:信号(signal)机制是Linux系统中最为古老的...
  • 套接口为目前Linux上最为广泛使用的一种的进程间通信机制,与其他的Linux通信机制不同之处在于除了它可用于单机内的进程间通信以外,还可用于不同机器之间的进程间通信。但是由于Socket本身不支持同时等待和超时处理...
  • 超时等待设置关键在于 1、将socket置为非阻塞后 2、设定超时等待时间 3、时间结束后读取socket状态,进行判断 1、设置socket为非阻塞 记录下两种设置socket为非阻塞方式,分别是fcntl() 和 ioctl() 两个函数 fcntl...
  • linux TCP超时重传

    万次阅读 2013-06-04 11:16:48
    TCP超时重传是保证TCP可靠性传输的机制之一,当超时后...linux TCP超时重传是通过设置重传超时时钟icsk_retransmit_timer来实现的。 零窗探测超时时钟与重传超时时钟共用icsk_retransmit_timer,根据icsk_pending是IC
  • linux tomcat守护进程

    千次阅读 2015-08-12 13:09:19
    我们需要写一个进程监控的脚本,目的是检测tomcat进程是否停掉,如果挂了,自动拉起,所以我们写了如下的脚本,参考了一些资料,希望对有需要的人有所帮助。 #!/bin/bash echo "Start" URL="...
  • Linux实用教程(第三版)

    万次阅读 多人点赞 2019-08-27 22:55:59
    第一章 Linux系统初步了解 本章内容 1.1 Linux系统简介 1.2 Linux系统的特点和组成 1.3 Linux版本介绍 1.4 Red Hat Linux系统概述 1.1 Linux系统简介 1.1.1 什么是Linux 1.1.2 Linux系统的产生 1.1.3 Linux...
  • Linux】子进程的异步等待方式

    千次阅读 2017-07-22 16:13:05
    当子进程退出时,它会向父进程发送SIGCHLD信号,该信号的默认处理方式为忽略,当父进程以阻塞方式等待时,它不能处理自己的工作。 我们自定义一个捕捉信号的函数myhandler #include #include #include #include ...
  • 可设置超时次数。 自动记录已重启次数。 自动记录最后一次重启时间。 是否需要重新刷新桌面。 可重置当前重启次数和最后重启时间。 自动隐藏的托盘运行或者后台运行。 提供界面设置程序名称已经开启和暂停服务。
  • 使用timeout命令实现: timeout 5 cmd args
  • 在数据库的使用过程中可能遇到锁表的情况,导致其他进程访问同样的表时出现超时的情况。具体表现为,在MySQL中使用如下命令 SHOW PROCESSLIST显示结果为 其中,Status列表示语句的查询状态,若值为Locked,则...
  • linux应用程序中操作硬件看门狗的例程,可以从中了解硬件的文件访问方式。注意:不包括看门狗驱动实现。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,146
精华内容 40,058
关键字:

linux查询超时进程

linux 订阅