在bash中不同用户下产生背景过程



我知道我可以运行此命令来产生背景过程并获得pid:

PID=`$SCRIPT > /dev/null 2>&1 & echo $!`

并在不同用户下运行命令:

su - $USER -c "$COMMAND"

我不希望脚本作为root运行,我无法完全弄清楚如何将两者组合并获得产卵过程的pid。

谢谢!

我认为您想要runuser命令。一般语法:

runuser -l  userNameHere -c 'command'

我怀疑如果您将$脚本变量设置为上述(有适当的更改),则第一个命令将执行您想要的操作。

详细说明:请参阅以下内容:-Stackoverflow.com/questions/9119885/

特别是参见克里斯·多德(Chris Dodd)的以下报价:

不幸的是,在bash版本4之前,没有简单的方法,$ bashpid是 引入。您可以做的一件事是编写打印其父pid的微小程序:...

如果您有bash 4和bashpid,请参见脚本中的$$ vs $$在子壳中

我没有版本4,所以我无法提供其用法的示例。

或编写一个微小的C程序,该程序会执行其参数并将其设置为USER。甚至制作一个setuid shell脚本(通常不建议使用)。希望USER已固定;如果不是,请获取runuser的来源,这本质上是Runuser(不是POSIX命令)。

PID=`su - $USER -c "$SCRIPT > /dev/null 2>&1 & echo $!"`

您使用su的问题(上图)包括:

  • $!是在su-c子壳的上下文中执行的,而不是PID的当前外壳,
  • 您要求您的SCRIPT作为登录外壳运行,因此您甚至不知道USER的Shell是否支持$!
  • 您无法控制su(和用户的外壳)创建的亲子过程链。

iow,当您使用

PID=`$SCRIPT > /dev/null 2>&1 & echo $!`

仅涉及一个程序,bash和两个(也许是三个?)流程,您几乎可以完全控制。当您将su扔进混合物中时,它的改变远大于表面上的明显变化-bashsu支持类似的参数,对吗?!?出于明显的原因,su会在保护它及其"儿童环境免受攻击的情况下进行Mucoo Magic;它甚至不喜欢被放置在后台..

这已经很晚了,但是这是两个衬里,似乎需要两个,以便不等待$脚本完成:

su $USER -c "$SCRIPT 2>&1 & >> $LogOrNull echo $! > /some/writeable/path"
PID="$(cat /some/writeable/path)"

/some/writeable/path需要由$用户写作运行这些命令的用户将需要读取访问

相关内容

  • 没有找到相关文章

最新更新