44

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

4

10 回答 10

53

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

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

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

于 2013-11-13T22:34:26.203 回答
23

恕我直言,这里的问题不是nohup,而是后台处理sudo。

您将进程置于后台(& 在命令末尾),但可能 sudo 需要密码身份验证,这就是进程停止的原因。

尝试其中之一:

1)从命令末尾删除&符号,回复密码提示和后记将其置于后台(通过键入 CTRL-Z - 停止进程并发出 bg 命令将其发送到后台)

2) 将 /etc/sudoers 更改为不询问用户密码,方法是包含以下行:myusername ALL=(ALL) NOPASSWD: ALL

如果除了密码回复之外,您的应用程序还等待其他输入,那么您可以将输入通过管道传递给命令,如下所示: $ catresponse.txt|sudo mycommand.php

hth

于 2013-07-04T18:13:27.367 回答
6

你可以试试

sudo su

接着

nohup ./ascii_loader_script.pl 20070502 ctm_20070502.csv &

代替

nohup sudo ./ascii_loader_script.pl 20070502 ctm_20070502.csv &
于 2019-09-08T21:14:23.457 回答
5

您必须先使用 sudo,然后再使用 nohup。

sudo nohup ./ascii_loader_script.pl 20070502 ctm_20070502.csv &
于 2015-03-17T12:53:54.100 回答
1

首先,您应该切换sudonohup。接着:

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

echo Starting ...可以用任何不做太多的命令替换。我只将它用作sudo.

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

于 2015-02-16T13:56:32.073 回答
1

这应该工作

sudo -b -u userName ./myScript > logFile

我很想知道,在 ./myScript 在后台成功运行后,我可以将此日志文件作为电子邮件发送。

于 2014-11-21T09:32:15.140 回答
1

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

sudo sh -c 'nohup openvpn /etc/openvpn/client.ovpn 2>&1 > /dev/null &'
于 2016-11-18T01:58:01.293 回答
1

我打开一个编辑器并输入这些行:

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

MyProcess是我想以超级用户身份运行的任何东西。)

然后我将文件保存为 MyShellScript.sh 。

然后更改文件权限以允许执行。然后在终端中运行它。“-b”选项告诉 sudo 在后台单独运行该进程,因此该进程在终端会话终止后继续运行。

在 linux-mint 为我工作。

于 2016-10-10T20:48:59.303 回答
1

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

  1. nohup执行sudo ,最后不带 &符号
  $ 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
于 2021-02-11T07:29:24.057 回答
0

尝试:

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

当您关闭 xterm 时,PHPWeb 服务器仍然存在。
不要放在nohup前面sudo,否则PHP关闭 xterm 后 web 服务器会被杀死。

于 2014-04-03T01:56:54.157 回答