如何获取使用nohup运行的程序列表

108

我正在使用SSH连接访问运行CentOS (Linux发行版)的服务器。 由于我不能一直保持登录状态,所以我使用"nohup [command] &"来运行我的程序。

我找不到如何获取我使用nohup启动的所有程序列表。 "jobs"只在我注销前有效。之后,如果我再次登录,jobs命令将不显示任何内容,但我可以在日志文件中看到我的程序仍在运行。

是否有一种获取我使用"nohup"启动的所有程序列表的方法?


找到了一篇很棒的文章,可以帮助回答这个问题:https://www.cyberciti.biz/faq/find-out-what-processes-are-running-in-the-background-on-linux/。最重要的是,如果您能解释ps命令的输出,特别是“stat”列,那将非常有帮助。如果您不知道,请立即阅读该文章;-) - jumping_monkey
7个回答

156

当我开始使用$ nohup storm dev-zookeper时,

METHOD1:使用jobs

prayagupd@prayagupd:/home/vmfest# jobs -l
[1]+ 11129 Running                 nohup ~/bin/storm/bin/storm dev-zookeeper &

注意: jobs 命令只能在启动 nohup 的终端会话中显示 nohup 进程。如果关闭该终端会话或在新的会话中尝试,它将无法显示 nohup 进程。建议使用 METHOD2。

METHOD2: 使用 ps 命令。

$ ps xw
PID  TTY      STAT   TIME COMMAND
1031 tty1     Ss+    0:00 /sbin/getty -8 38400 tty1
10582 ?        S      0:01 [kworker/0:0]
10826 ?        Sl     0:18 java -server -Dstorm.options= -Dstorm.home=/root/bin/storm -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dsto
10853 ?        Ss     0:00 sshd: vmfest [priv] 

TTY列带有? => 表示没有使用nohup运行的程序。

描述

  • TTY列 = 进程关联的终端
  • STAT列 = 进程的状态
    • S = 可中断休眠(等待事件完成)
    • l = 多线程(使用CLONE_THREAD,例如NPTL pthreads)

参考资料

$ man ps # 然后搜索/PROCESS STATE CODES


10
方法2没有列出使用nohup启动的程序列表。它列出的是未连接到TTY的进程,这是完全不同的事情:使用nohup启动的进程会一直与其父TTY连接,直到TTY关闭;而未连接到TTY的进程并不一定是使用nohup启动的。也就是说,方法2列出了除其他进程外,运行nohup的一些程序。 - Arcturus B
7
工作不适用于我,仅适用于相同的 SSH 会话,如果我断开连接并重新连接,则不再列出先前列出的运行中的 nohup 进程。 - Mojimi
3
"$ ps xw" 对我有用。 - ORHAN ERDAY

39

不要使用nohup,而应该使用screen。它可以实现相同的结果 - 您的命令正在运行“分离”模式。但是,您可以恢复屏幕会话并重新进入其“隐藏”的终端,并查看该终端中的最近进度。

screen有很多选项。我经常使用以下选项:

启动第一个屏幕会话或接管最近的分离会话:

screen -Rd 

要从当前会话中分离:Ctrl+ACtrl+D

您也可以启动多个屏幕 - 阅读文档。


8
对我来说,这似乎是一个不错的替代方案。我还发现可以用“ps auwx”命令找到PID。 - Nils De Winter
13
问题明确地询问“是否有一种方法可以获取我使用'nohup'启动的所有程序列表?”,然而这个答案甚至没有稍微回应问题。为什么会被接受? - Luke Joshua Park
6
因为回到2013年时,那是唯一有用的答案。 - Nils De Winter

30
如果您将标准输出重定向到“nohup.out”,只需查看谁使用此文件。
lsof | grep nohup.out

2
这是一个聪明的方法。但在我的情况下,它没有返回任何结果。虽然我确信nohup命令仍在运行,并且正在使用nohup.out文件。 - Julius Š.
1
在所有TTY中都可以,但每个nohup显示双重进程! - Nabi K.A.Z.
@NabiK.A.Z. 来自 man lsof 的说法是:“通常情况下,线程和任务会继承调用者的文件,但可能会关闭一些文件并打开其他文件,因此 lsof 总是报告线程和任务的所有打开文件。” 我在 nohup 的 man 中找不到相关信息,但它似乎使用两个线程而不是一个。 - Yaroslav Nikitenko
1
如果将输出重定向到其他文件,则无法正常工作。 - Bharath Kumar

10

你无法直接获取以 nohup 开头的命令列表,但是你可以通过使用命令 ps x 来查看它们和其他进程一起运行。以 nohup 开始的命令在 TTY 列中将有一个问号。


4
"ps x"无法帮助,但我发现 "ps auxw" 可以。 - Nils De Winter

10

你也可以直接使用top命令,你的用户ID将指示正在运行的任务及其时间。

$ top

(这将显示所有正在运行的任务)

$ top -U [用户ID]

(这将显示特定于该用户ID的任务)


此外,这个好处在于它会停留在您的控制台上,因此您可以观察作业并知道何时完成。 - rgilligan

2
sudo lsof | grep nohup.out | awk '{print $2}' | sort -u | while read i; do ps -o args= $i; done

返回使用nohup.out文件的所有进程


0

根据个人经验,我更喜欢使用top命令,更多有关如何使用top的示例,请参见javapoint。正如用户Jcrow06已经建议的那样,运行top将显示服务器上所有正在运行的作业,如果只对特定[userid]的作业感兴趣,可以简单地运行top -u [userid]

运行top的好处是可以显示所有正在运行的进程(包括在后台启动的nohup进程),即使它们不是来自当前终端会话或其他用户。此外,通过top可以看到任务占用了多少CPU和内存,并且已经运行了多长时间。这对于判断它是否仍在正确运行可能很有帮助。

注意:默认情况下,top根据CPU使用率排序任务,但如果需要,可以调整排序顺序。此外,如果您注意到不需要的任务,您可以通过按下k键后输入进程ID PID来轻松终止它们。


这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - HiroCereal

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