linux – 以另一个用户身份启动脚本
我在/etc/init.d/中创建了一个脚本,它必须从其主目录中运行其他(非root特权)用户的其他几个脚本,就像它们启动它们一样.
我使用以下命令启动这些脚本:sudo -b -u< username> < script_of_a_particular_user> 它有效.但对于每个继续运行的用户脚本(例如一些看门狗),我看到一个相应的父sudo进程,仍处于活动状态并以root身份运行.这会在活动进程列表中造成混乱. 所以我的问题是:我如何从现有的bash脚本中启动(fork)另一个脚本作为另一个用户并将其保留为孤立(独立)进程? 更详细的解释: 或者我也有兴趣,如果我可以使用一些现有的解决方案来解决这个问题. UPDATE 在那里接受的答案,使用: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 startpar -f -- <name_of_my_init.d_script> 为什么会产生这个过程?显然我做错了,因为没有其他init.d脚本运行此进程. 更新4 另一个问题是进一步讨论非特权用户的启动机制: 解决方法
对此的正确答案是,对于正确的“守护程序”,需要将标准输入,标准输出和标准错误重定向到/ dev / null(或某些实际文件):
su someuser -c "nohup some_script.sh >/dev/null 2>&1 &" su – 将用户身份替换为某个用户 这基本上就是Debian dpkg的start-stop-daemon实用程序的核心功能.这就是为什么我更喜欢以这种方式启动脚本而不是在我的代码中引入另一个外部实用程序调用. start-stop-daemon在你需要启动的完整破坏守护程序以及然后需要start-stop-daemon提供的其他功能的情况下非常有用(例如检查指定的进程是否已经运行,以便它不会再次发射它. 还值得注意的是,您还可以关闭进程的文件描述符,而不是将它们重定向到/ dev / null,例如: su someuser -c "some_script.sh 0<&- 1>&- 2>&- &" 0<& - 关闭标准输入(0) 方向< >标志无关紧,因为指定了长文件描述符号.所以这同样好: 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上: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |