我使用以下命令启动这些脚本:sudo -b -u< username> < script_of_a_particular_user>
它有效.但对于每个继续运行的用户脚本(例如一些看门狗),我看到一个相应的父sudo进程,仍处于活动状态并以root身份运行.这会在活动进程列表中造成混乱.
所以我的问题是:我如何从现有的bash脚本中启动(fork)另一个脚本作为另一个用户并将其保留为孤立(独立)进程?
更详细的解释:
我基本上试图通过运行在其主目录中找到的各个子目录(名为.startUp和.shutDown)中找到的可执行文件,向计算机上的其他用户提供在系统启动或系统关闭时运行的方法.
由于我没有找到任何其他方法,我编写了我的bash脚本,它正是这样做的,并且我已经将它配置为/etc/init.d/中的服务脚本(通过遵循骨架示例),所以当它运行时使用start参数从.startUp目录启动所有内容,当它使用stop参数运行时,它会启动所有用户的.shutDown目录中的所有内容.
或者我也有兴趣,如果我可以使用一些现有的解决方案来解决这个问题.
UPDATE
我环顾四周,发现了这个问题:
https://unix.stackexchange.com/questions/22478/detach-a-daemon-using-sudo
在那里接受的答案,使用:sudo -u用户sh -c“daemon& disown%1”,适合我.但我也试过没有被拒绝%1,它是相同的.所以这就像我预期的那样对我有用:
sudo -u <username> bash -c "<script_of_a_particular_user> &"
我现在的另一个问题是,为什么它没有被取消?对于一些潜在的特殊情况,我是否仍然应该离开不公开电话?
更新2
显然这也有效:
su <username> -c "<script_of_a_particular_user> &"
这个电话和sudo电话之间有什么区别吗?我知道这可能是一个完全不同的问题.但是既然我在这里找到了答案,也许是为了这个话题,有人可以在这里澄清一下.
更新3
使用su或sudo这两种方法现在都会在启动计算机后生成一个新的startpar进程(以root身份运行的单个进程).在进程列表中可见为:
startpar -f -- <name_of_my_init.d_script>
为什么会产生这个过程?显然我做错了,因为没有其他init.d脚本运行此进程.
更新4
startpar的问题已解决.我已经开始了另一个问题:
startpar process left hanging when starting processes from rc.local or init.d
另一个问题是进一步讨论非特权用户的启动机制:
Providing normal users(non-root) with initialization and shutdown auto-run capabilities
解决方法
su someuser -c "nohup some_script.sh >/dev/null 2>&1 &"
su – 将用户身份替换为某个用户
-c – su参数以运行指定的命令
nohup – 运行一个免于挂断的命令.防止父进程终止子进程的情况.这里添加以防万一.但实际上对我的具体情况没有任何影响.是否需要取决于环境(检查shopt)
> / dev / null – 将标准输出重定向为空,基本上禁用它.
2>& 1 – 将标准错误(2)输出重定向到标准输出(1),重定向到null
&安培; – 分离到背景,这会将标准输入重定向到/ dev / null.
这基本上就是Debian dpkg的start-stop-daemon实用程序的核心功能.这就是为什么我更喜欢以这种方式启动脚本而不是在我的代码中引入另一个外部实用程序调用. start-stop-daemon在你需要启动的完整破坏守护程序以及然后需要start-stop-daemon提供的其他功能的情况下非常有用(例如检查指定的进程是否已经运行,以便它不会再次发射它.
还值得注意的是,您还可以关闭进程的文件描述符,而不是将它们重定向到/ dev / null,例如:
su someuser -c "some_script.sh 0<&- 1>&- 2>&- &"
0<& - 关闭标准输入(0)
1>& – 关闭标准输出(1)
2>& – 关闭标准错误(2)输出
方向< >标志无关紧,因为指定了长文件描述符号.所以这同样好:
su someuser -c "some_script.sh 0>&- 1>&- 2>&- &"
要么
su someuser -c "some_script.sh 0<&- 1<&- 2<&- &"
然而,有一个更短的方式来编写它,没有stdin和stdout的数字,方向确实重要:
su someuser -c "some_script.sh <&- >&- 2>&- &"
当文件描述符被关闭或重定向到/ dev / null(start-stop-daemon正在重定向到/ dev / null)时,该进程可以安全地在后台作为守护进程运行.这就是在启动时启动脚本以避免问题(startpar)所需要的.
我从最初的想法中实现了整个解决方案并将其放在GitHub上:
https://github.com/ivankovacevic/userspaceServices