2012-02-13 34 views
0

我有一个从新创建的shell运行的脚本。 操作系统是红帽企业Linux服务器版本5.4(Tikanga)。 在脚本检测到某个应用程序(由脚本启动)挂起的特定时刻,脚本尝试终止它启动的所有过程。我以为,终止当前用户在当前的shell启动的所有进程正确的命令是:pkill杀死由父shell中的其他用户启动的sshd进程

pkill /? 

的问题是,它杀死了在母贝(由init.d中)开始的sshd和腻子控制台断开连接显示错误信息。

我在想:

  1. 怎么可能在特定的外壳特定用户终止过程中母贝其它用户开始了吗?
  2. 什么是正确的命令终止当前正在运行的脚本启动的所有进程?

我已经找到了一些解决方案,我存储所有PID和当脚本需要终止他们,我在循环运行以下命令:

[[email protected] ~]# pkill $(ps aux | grep $pid | awk '{print $2}') 

不过,我要寻找一个衬里只是终止当前脚本启动的所有进程。

回答

1

您可以按当前进程pid过滤子进程。 ps命令可以使用--ppid参数来执行此操作。

ps opid --ppid=7051 | tail -n +2 | xargs kill 

这里tail -n +2 is剥去ps头。

+0

我用$(echo $$)替换静态进程id后试过了,它总是抱怨2个进程无法找到(kill 13925:No such process)。有什么想法吗? – aviad 2012-02-13 10:05:31

+0

这是因为'ps'返回它自己的pid和'tail'的pid。你可以试试'ps opid --ppid = $$ | tail -n +2 | xargs睡眠“并在另一个终端运行'ps ax'。结果是'ps'和'tail'已经退出,但是'xargs'和'sleep'仍在运行。只需使用'ps opid --ppid = $$ | tail -n +2 | xargs kill&>/dev/null'。如果错误代码是问题,您可以追加'; true',因此退出代码始终为0. – core1024 2012-02-13 11:35:09

1

我认为终止当前用户在当前的shell启动的所有进程正确的命令是:

pkill /? 

这个命令匹配系统中的每一个过程,因为它有效地只需要0符号从进程名称到匹配。 pgrep -l /?表明。

特定shell中的特定用户如何终止由父shell中的其他用户启动的进程?

man kill(2)

For a process to have permission to send a signal it must either be 
    privileged (under Linux: have the CAP_KILL capability), or the real or 
    effective user ID of the sending process must equal the real or saved 
    set-user-ID of the target process. In the case of SIGCONT it suffices 
    when the sending and receiving processes belong to the same session. 

你调用从用户rootpkill

怎么做才能正确的命令来终止脚本所启动的所有进程正在运行?

bash开始时,它创建它自己的进程组。它创建的子进程被放入同一个进程组。因此:

kill -- -$$ 

杀死当前脚本启动的所有进程。只要这些流程不成为小组组长。

+0

该脚本不是由root运行的。会议是不一样的。 Upvote第二个问题。 – aviad 2012-02-13 13:42:52