我正在尝试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并将其删除有点复杂。
答案 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 &
使用chown
和chmod
将其设置为可执行并由nobody
拥有,然后运行su nobody -c /usr/local/bin/start_my_command
。
答案 4 :(得分:0)
关于在会话上运行此操作的注释是,如果您在后台运行,则有一个与该会话相关联的作业,并且后台作业可能会被杀死(su -c解决了这个问题)。
要取消与外壳程序的关联(因此您可以退出外壳程序但保持进程运行),请使用disown
。