我知道我可以运行此命令来产生背景过程并获得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
扔进混合物中时,它的改变远大于表面上的明显变化-bash
和su
支持类似的参数,对吗?!?出于明显的原因,su
会在保护它及其"儿童环境免受攻击的情况下进行Mucoo Magic;它甚至不喜欢被放置在后台..
这已经很晚了,但是这是两个衬里,似乎需要两个,以便不等待$脚本完成:
su $USER -c "$SCRIPT 2>&1 & >> $LogOrNull echo $! > /some/writeable/path"
PID="$(cat /some/writeable/path)"
/some/writeable/path
需要由$用户写作运行这些命令的用户将需要读取访问