如何将root用户切换到root用户来杀死父进程?

如何将root用户切换到root用户来杀死父进程?

我正在开发一个复杂的自动化脚本,它将自动执行我的大部分构建、安装、部署和安装后过程。问题是,在所有需要发出的命令中,有一个命令要求用户是 root。 (这是一个要求约束,因为需要其他用户(我们称之为 user1)不在 sudoers 列表中)

基本上,我构建脚本的方式是,我有一个必须以 root 身份运行的启动脚本。该脚本将以 user1 身份调用另外两个脚本。

所有三个脚本共享一个sharedFunctions.sh定义公共函数的脚本。在此脚本中,我有一个run_command函数需要接受命令和失败字符串以及对此问题不重要的其他参数。

现在,如果失败字符串出现在给定命令的输出中,我想终止父进程,从而停止整个列车。我有一个从 root 脚本中获取的父 PID 的导出变量,但是如果该脚本在运行两个 user1 脚本中的任何一个时失败,我无法终止该进程,因为它由 root 拥有。

有没有一种方法可以“退出”回root而不需要凭据(类似于在终端中的操作),这样我就可以杀死root拥有的PID?

*****编辑*****

这是我的脚本需要遵循的非常简化的过程,格式如下(必需的用户:函数):

user1:maven install
user1:scp jars to chef server
root:chef command
user1:chef command
user1:post-installation scripts

我有三个脚本和一个源脚本

user1cmd1.sh parentscript.sh user1cmd2.sh sharedFunctions.sh

parentscript.sh一个脚本使用它提取 PID,export TOP_PID=$$ 然后以 user1 身份调用 user1cmd1.sh,当该脚本完成时,它返回到父脚本,并以 root 身份运行 Chef 命令,然后以 user1 身份调用 user1cmd2.sh

myrun_command中定义的sharedFunctions.sh脚本类似于以下内容:

run_command(){
    cmd=$1
    fail=$2
    if $cmd | grep -q $fail;then
         kill $TOP_PID #there is more to this particular command, but I don't have it in front of me
    fi
}

答案1

parentscript.sh可以创建一个将其传递到的收割者进程$TOP_PID。收割者进程将尝试从命名管道这是可写的 user1。如果没有任何内容写入管道,收割机只会阻塞读取,不执行任何其他操作,但如果有任何内容写入管道,收割机的读取就会完成,收割机将继续执行其余代码,从而终止顶级进程。

相关内容