2010-06-18 218 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嘗試腳本