如何在不产生两个进程的情况下以不同的用户身份运行nohup?

时间:2012-07-30 18:42:01

标签: bash process nohup

我正在尝试nohup命令并以不同的用户身份运行它,但每次执行此操作时都会生成两个进程。

例如:

$ nohup su -s /bin/bash nobody -c "my_command" > outfile.txt &

这肯定会将my_command作为nobody运行,但还有一个我不想出现的额外进程:

$ ps -Af
.
.
.
root ... su -s /bin/bash nobody my_command
nobody ... my_command

如果我杀死root进程,那么nobody进程仍然存在......但是有没有办法不运行root进程?因为获取my_command的id并将其删除有点复杂。

5 个答案:

答案 0 :(得分:10)

这可以通过以下方式实现:

su nobody -c "nohup my_command >/dev/null 2>&1 &"

并写下' my_command'的pid在pidFile中:

pidFile=/var/run/myAppName.pid
touch $pidFile
chown nobody:nobody $pidFile
su nobody -c "nohup my_command >/dev/null 2>&1 & echo \$! > '$pidFile'"

答案 1 :(得分:3)

nohup runuser nobody -c "my_command my_command_args....." < /dev/null >> /tmp/mylogfile 2>&1 &

答案 2 :(得分:2)

如果用户使用nologin shell,请运行如下:

su - nobody -s /bin/sh -c "nohup your_command parameter  >/dev/null 2>&1 &"

或者:

runuser - nobody -s /bin/sh -c "nohup your_command parameter  >/dev/null 2>&1 &"

或者:

sudo su - nobody -s /bin/sh -c "nohup your_command parameter  >/dev/null 2>&1 &"

sudo runuser -u nobody -s /bin/sh -c "nohup your_command parameter  >/dev/null 2>&1 &"

答案 3 :(得分:1)

你最好在例如创建一个小脚本。 /usr/local/bin/start_my_command喜欢这样:

#!/bin/bash
nohup my_command > outfile.txt &

使用chownchmod将其设置为可执行并由nobody拥有,然后运行su nobody -c /usr/local/bin/start_my_command

答案 4 :(得分:0)

关于在会话上运行此操作的注释是,如果您在后台运行,则有一个与该会话相关联的作业,并且后台作业可能会被杀死(su -c解决了这个问题)。

要取消与外壳程序的关联(因此您可以退出外壳程序但保持进程运行),请使用disown