2010-06-18 220 views
3

我编写了以下脚本,如果grep在文件中找不到相关字符串,则启用20秒的超时。从kill命令中kill -9 +禁用消息(标准输出)

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

./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 

回答

3

kill -9 $RESULT &> /dev/null

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

+0

我已经尝试了它的不工作 – yael 2010-06-18 10:56:42

+0

您错过了1>或2>也不行 请其他的意见? – yael 2010-06-18 11:00:09

+0

>重定向stdout和stderr,所以当进程不存在或者当它终止进程时它不会输出任何东西。问题中的代码只会将stderr重定向到'kill',所以这个答案就是解决问题的方法。 – 2010-06-18 11:21:25

2

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. 
+0

对不起,我不能使用超时 ,我不能安装,因为Linux不是我的系统 – yael 2010-06-18 11:02:38

+0

那么你应该将你的'grep'命令的STDERR重定向到'/ dev/null',尝试添加'2>'或'&gt ;,而不是“kill” – 2010-06-18 11:05:04

+0

是的,但我做到了,它不工作 请参阅ny progarm yael – yael 2010-06-18 11:07:00

2

消息由你的shell印刷最好看,而不是杀死进程。

尽量捉迷藏的proccess到在另一个shell被杀,封装命令被杀害是这样的:

sh -c 'command_to_be_inettrupted&' 

的想法是让比它启动的进程较早的shell实例退出。您可能还需要“禁用”您的命令,但这对我的系统来说是不必要的。

例如:

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

此代码将不会产生任何输出,尽管第一睡眠情况下被杀害。

+0

我该怎么做 因为我所有的commnad都在(............)& – yael 2010-06-18 11:24:19

+0

这没关系。把所有东西放在另一个shell中。 您也可以删除括号。 – Basilevs 2010-06-18 11:39:21

+0

我这样做,它不工作(.......) 下一步做什么???????? – yael 2010-06-18 11:41:23

0

我认为这条消息来自作业控制。尝试关闭设置+ m
如果在ksh下无法正常工作,请使用#!/ bin/bash尝试脚本