0

我用来将标准错误转储到文件的代码如下所示:

    sudo COMMAND 2> FILENAME.txt

我希望能够通过获取它的 PID 然后像这样使用 KILL 来终止 COMMAND 进程:

    sudo COMMAND 2> FILENAME.txt &
    PID=$!
    sudo kill $PID

我的问题是,我是在杀死“命令”进程还是在杀死“将错误转储到文件”进程?

如果我要终止“将错误转储到文件”进程,如何终止实际的命令进程?

4

3 回答 3

2

只有一个过程:sudo.

  1. shell 派生了一个新进程,即 shell 的一个子进程。
  2. 它的标准错误被重定向到文件。
  3. 该命令在子进程中编辑sudo commandexec()
  4. 父进程将子进程的 PID 存储在$!.

sudo依次根据其配置设置权限,然后执行另一个exec()以替换自身command

于 2013-10-08T17:55:24.130 回答
2

将标准 IO 重定向到文件不是一个过程。您将杀死该sudo进程,但该进程应在​​退出时关闭文件句柄。也就是说,重定向发生在sudo命令执行之前,因此如果您的用户帐户没有写入权限FILENAME.txt,shell 将在执行命令之前出错。

参考:https ://unix.stackexchange.com/questions/1416/redirecting-stdout-to-a-file-you-dont-have-write-permission-on

于 2013-10-08T17:52:02.947 回答
0

每个进程在启动时都会从其父进程继承某些东西。其中之一是一组打开的文件句柄(在 POSIX 中,这至少包括标准输入、标准输出和标准错误,但其他的也是可能的)。重定向操作符只是简单地修改哪些文件句柄被传递给新进程。

于 2013-10-08T18:54:24.167 回答