使sudo和nohup同时工作

47

我是Linux的新手。

我有一个使用Perl编写的脚本,需要两个命令行参数。我尝试在后台运行它,但遇到了以下问题:

[~user]$ nohup sudo ./ascii_loader_script.pl 20070502 ctm_20070502.csv &
[2] 19603
[~user]$ nohup: appending output to `nohup.out'

系统返回"nohup: appending output to `nohup.out'"后,将不会出现新的提示符。只要我输入其他命令,shell就会告诉我该进程已停止:

[~user]$ nohup sudo ./ascii_loader_script.pl 20070502 ctm_20070502.csv &
[2] 19603
[~user]$ nohup: appending output to `nohup.out'
ls
ascii_loader_script.pl  format_wrds_trd.txt  nohup.out  norm_wrds_trd.cfg
[2]+  Stopped                 nohup sudo ./ascii_loader_script.pl 20070502 ctm_20070502.csv

我查看了这篇文章,并尝试在执行命令之前执行“sudo date”。仍然得到了相同的结果。http://www.sudo.ws/pipermail/sudo-users/2003-July/001648.html


3
我可以建议另一种解决方案吗?您可能想使用nohup来保护进程不被关闭,如果是的话,您最好使用screen - January
建议解决方法:将 sudo echo hi 或其他命令添加到您的 .bashrc 文件中,这样您只需在开始时输入一次密码。 - phil294
10个回答

57

解决方法是使用sudo的-b标志在后台运行命令:

$ sudo -b ./ascii_loader_script.pl 20070502 ctm_20070502.csv

只有在您希望程序在关闭当前终端会话后继续运行时,才应该使用nohup。


16
非常感谢。现在我可以做一些很棒的事情,比如nohup sudo -b mongod - Tad Lispy
3
等等,但是如果您希望在关闭当前终端会话后仍要继续该进程怎么办? - Kurt Wheeler
我想跟进@KurtWheeler所说的话,如果您关闭终端会发生什么? 命令的输出会发生什么变化? 这就是nohup的全部意义,它在后台运行,输出到文件中,并且在您退出终端时不会停止。 sudo -b选项的文档还有很多需要改进的地方。 - noisygecko

23

我认为这里的问题不在于nohup,而是在于后台处理sudo。

您将进程放入后台(在命令末尾加上 &),但是sudo可能需要密码验证,因此该进程停止。

尝试以下方法之一:

1)从命令末尾删除和号,回复密码提示,然后将其放入后台(通过输入CTRL-Z停止该进程并使用bg命令将其发送到后台)

2)更改/etc/sudoers文件以不要求用户输入密码,方法是添加以下行:myusername ALL=(ALL) NOPASSWD: ALL

如果除了密码回复之外,您的应用程序还等待其他输入,则可以像这样将输入作为管道传输到该命令: $ cat responses.txt | sudo mycommand.php

希望对你有所帮助


在执行 bg 命令后,是否有可能停止进一步的输出? - Matt Canty
这正是我的问题。谢谢你的回答! - Josh Padnick
sudo mycommand.php <responses.txtcat 方法更加优秀。使用 cat 方法会启动两个独立的可执行文件(其中一个是 /bin/cat);而使用 <responses.txt,你只会启动 sudo 并将其标准输入直接连接到 responses.txt - Charles Duffy

10

您可以尝试

sudo su

然后

nohup ./ascii_loader_script.pl 20070502 ctm_20070502.csv &

替代

nohup sudo ./ascii_loader_script.pl 20070502 ctm_20070502.csv &

3
我认为这比被接受的答案和得票最高的答案都要好。那两个答案都没有解决如何使用sudo运行nohup的问题。 - Kurt Wheeler
这个是我用过最好的! - Pedro Queiroga
我的老板总是这样做,它会搞乱很多东西。他主要使用Windows,只是涉猎Linux。编辑:因为它会更改您的用户而不是使用具有提升权限的用户执行命令。 - grofte

5

你必须先使用sudo,其次是nohup。

sudo nohup ./ascii_loader_script.pl 20070502 ctm_20070502.csv &

6
对于其他读者,这里显示的命令行不正确,但关于顺序的评论是正确的。& 符号将把 sudo 放到后台运行,而不是以 sudo 权限运行命令;相反,像其他答案所提到的那样,可以使用 -b 标志来实现以 sudo 权限后台运行命令。 - pydsigner
1
为什么??使用'sudo'的原因是什么? - Mohsen Abasi
请提高问题 - 请解释为什么这个顺序是正确的。 - flow2k
从那时起,我记得第一次使用nohup时它没有起作用。我不记得原因是什么了。 - QkiZ

2

我对后台评估磁盘碎片的工作解决方案如下:

  1. 使用带sudonohup但不带&符号执行以下命令:
 $ sudo nohup nice -20 find / -type f -exec filefrag "{}" \; | sed 's/^\(.*\): \([0-9]\+\) extent.*/\2\t\1/'| awk -F ' ' '$1 > 0' | sort -n -r | head -50 > filefrag.txt 
  1. 输入sudo密码;
  2. 按下Ctrl+Z
  3. 将正在运行的进程放到后台。
$ bg 1
[1]+ sudo nohup nice -20 find / -type f -exec filefrag "{}" \; | sed 's/^\(.*\): \([0-9]\+\) extent.*/\2\t\1/' | awk -F ' ' '$1 > 0' | sort -n -r | head -50 > filefrag.txt &
  1. 现在你可以退出终端并稍后登录。该进程将在后台继续运行。因为使用了nohup

1

我打开一个编辑器,输入了以下这些行:

#!/bin/bash
sudo echo Starting ...
sudo -b MyProcess

(其中MyProcess是我想以超级用户身份运行的任何内容。)

然后将文件保存在所需位置,命名为MyShellScript.sh。

然后更改文件权限以允许执行。 然后在终端中运行它。 "-b"选项告诉sudo在后台单独运行进程,因此进程在终端会话结束后仍然运行。

在Linux Mint中对我有效。


1

你可以将其设置为你的别名:

sudo sh -c 'nohup openvpn /etc/openvpn/client.ovpn 2>&1 > /dev/null &'

1
这应该可以工作。
sudo -b -u userName ./myScript > logFile

我只是好奇,想知道在./myScript成功在后台运行后,是否可以将这个log文件作为电子邮件发送。


1

首先,你应该交换sudonohup的位置。 然后:

if sudo echo Starting ...
then
    sudo nohup <yourProcess> &
fi

echo Starting ... 可以替换为任何不会产生太多影响的命令。 我只是将其用作sudo的虚拟命令。

通过这种方式,if语句中的sudo触发密码检查。 如果密码正确,则sudo会话已登录,第二个调用将成功,否则if将失败并且不执行实际命令。


0

尝试:

xterm -e "sudo -b nohup php -S localhost:80 -t /media/malcolm/Workspace/sites &>/dev/null"

当你关闭xterm时,PHP Web服务器仍然在运行。
不要在sudo之前加上nohup,否则在关闭xterm后,PHP Web服务器将被终止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接