【问题标题】:kill -9 + disable messages (standard output) from kill commandkill -9 + 禁用来自 kill 命令的消息(标准输出)
【发布时间】:2010-06-18 10:49:20
【问题描述】:

我编写了以下脚本,如果 grep 在文件中找不到相关字符串,则启用 20 秒超时。

脚本运行良好,但是脚本的输出是这样的:

./test: line 11: 30039: Killed
  1. 如何通过 kill 命令禁用此消息?

  2. 如果进程不存在,如何告诉 kill 命令忽略?

THX
耶尔

#!/bin/ksh  
( sleep 20 ; [[ ! -z ` ps -ef | grep "qsRw -m1" | awk '{print $2}' ` ]] && kill -9  2>/dev/null ` ps -ef | grep "qsRw -m1" | awk '{print $2}' `   ; sleep 1 ) &
RESULT=$! 
print "the proccess:"$RESULT
grep -qsRw -m1 "monitohhhhhhhr" /var
if [[ $? -ne 0 ]]
then
print "kill "$RESULT
  kill -9 $RESULT
fi
print "ENDED"


./test

the proccess:30038
./test: line 11: 30039: Killed
kill 3003

【问题讨论】:

    标签: linux ksh


    【解决方案1】:

    我认为这条信息来自工作控制。尝试使用 set +m 将其关闭
    如果这在 ksh 下不起作用,请尝试使用 #!/bin/bash

    的脚本

    【讨论】:

      【解决方案2】:

      kill -9 $RESULT &> /dev/null

      这会将stdoutstderr 发送到/dev/null。

      【讨论】:

      • 你错过了 1> 或 2> 并且那些也不起作用请其他建议?
      • &> 重定向标准输出和标准错误,因此当进程不存在或杀死进程时它不会输出任何内容。问题中的代码只为kill 重定向stderr,所以这个答案就是这样做的方法。
      【解决方案3】:

      你最好看看timeout命令

      man timeout
      
      NAME
             timeout - run a command with a time limit
      
      SYNOPSIS
             timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
             timeout [OPTION]
      
      DESCRIPTION
             Start  COMMAND,  and  kill  it if still running after NUMBER seconds.  SUFFIX may be `s' for
             seconds (the default), `m' for minutes, `h' for hours or `d' for days.
      

      【讨论】:

      • 对不起,我不能使用超时,我不能安装,因为 linux 不是我的系统
      • 那么你应该将你的grep命令的STDERR重定向到/dev/null,尝试添加2>&>,但是到“grep”命令,而不是“kill”
      • 你也可以在这里查看解决方案unix.com/shell-programming-scripting/…
      • ps -ef | grep "qsRw -m1" 2> /dev/null | awk '{print $2}' 2> /dev/null
      • 不是 grep ,我需要忽略来自 kill 命令而不是 grep 的消息
      【解决方案4】:

      消息是由你的 shell 打印的,而不是被杀死的进程。

      尝试在另一个shell中运行要被杀死的进程,像这样封装被杀死的命令:

      sh -c 'command_to_be_inettrupted&'
      

      这个想法是让 shell 实例早于它启动的进程退出。您可能还需要“nohup”您的命令,但这在我的系统上是不必要的。

      例如:

      sh -c 'sleep 10&' ; sleep 1; killall sleep
      

      此代码不会产生任何输出,尽管第一个睡眠实例已被杀死。

      【讨论】:

      • 没关系。只需将所有内容放在另一个外壳中即可。您也可以删除括号。
      • 我也这样做,但它不起作用??????????????????????? su -c '睡眠 20 ; [[! -z`ps -ef | grep "qsRw -m1" | awk '{print $2}' ` ]] && kill -9 ` ps -ef | grep "qsRw -m1" | awk '{print $2}' ` ;睡觉 1' &
      • 你误解了我的想法。您刚刚显示的代码是中断代码。我建议封装被打断的那个。 qsRw程序启动的部分。
      • su -c 'qsRw -m1';睡觉1; killall qsRw
      【解决方案5】:

      C 编程:

      /* Kill process without printing 'Killed' or 'Terminated' message. */
      kill(pid, SIGINT);
      

      execl("/bin/bash", "bash", "-c", "kill -SIGINT `pidof <your command>` >/dev/null 2>&1", (char *)NULL);
      

      killpid.c

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <sys/types.h>
      #include <signal.h>
      #include <unistd.h>
      /*
          $ gcc -W -Wall -O3 -std=c99 -pedantic -o killpid killpid.c
      */
      #define LEN     10
      
      int main()
      {
          char line[LEN] = {0};
          FILE *cmd = popen("pidof <your command>", "r");
      
          fgets(line, LEN, cmd);
          pid_t pid = strtoul(line, NULL, 10);
          printf("pid: %ld\n", pid);
      
          /* Kill process without printing 'Killed' or 'Terminated' message.*/
          kill(pid, SIGINT);
          pclose(cmd);
      
          return 0;
      }
      

      通过kill命令:

      $ kill -SIGINT `ps -ef | grep <your command> | awk '{print $2}'` >/dev/null 2>&1
      

      $ kill -SIGINT `pidof <your command>`
      

      【讨论】:

        猜你喜欢
        • 2017-09-29
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-10
        • 2016-05-02
        • 2014-01-28
        • 1970-01-01
        • 2016-07-26
        相关资源
        最近更新 更多