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

Posted

技术标签:

【中文标题】如何获取使用 nohup 运行的程序列表【英文标题】:How to get a list of programs running with nohup 【发布时间】:2013-05-24 10:23:11 【问题描述】:

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

我找不到如何获取我开始使用 nohup 的所有程序的列表。 “工作”仅在我注销之前有效。之后,如果我再次登录,jobs 命令什么也没有显示,但我可以在日志文件中看到我的程序仍在运行。

有没有办法获得我开始使用“nohup”的所有程序的列表?

【问题讨论】:

找到一篇可以帮助解决这个问题的优秀文章:cyberciti.biz/faq/…。最重要的是,如果您可以解释 ps 命令的输出,尤其是 stat 列,这将很有帮助。如果你不这样做,现在就去阅读这篇文章;-) 【参考方案1】:

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

方法1:使用jobs

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

注意:jobs 仅在启动 nohup 的同一终端会话上显示 nohup 进程。如果您关闭终端会话或尝试新会话,它将不会显示nohup 进程。首选方法2

方法2: 使用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] 

带有? => nohup 正在运行程序的 TTY 列。

说明

TTY 列 = 与进程关联的终端 STAT 列 = 进程状态 S = 可中断睡眠(等待事件完成) l = 是多线程的(使用 CLONE_THREAD,就像 NPTL pthread 一样)

参考

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

【讨论】:

方法2没有列出以nohup启动的程序。它列出了未附加到 TTY 的进程,这是完全不同的事情:以nohup 开始的进程保持附加到其父 TTY 直到它关闭;未附加到 TTY 的进程不一定以 nohup 启动。也就是说,方法 2 列出 在其他进程中,一些nohup运行的程序。 jobs 对我不起作用,仅适用于同一个 ssh 会话,如果我断开连接并再次连接,它不再列出之前列出的正在运行的 nohup 进程 $ ps xw 为我工作。【参考方案2】:

您应该使用screen,而不是nohup。它达到了相同的结果 - 您的命令正在“分离”运行。但是,您可以恢复屏幕会话并返回其“隐藏”终端并查看该终端内的最新进展。

screen 有很多选择。我最常使用这些:

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

screen -Rd 

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

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

【讨论】:

对我来说似乎是一个不错的选择。我还发现我可以找到带有“ps auwx”的 PID 问题清楚地问有没有办法获得我开始使用“nohup”的所有程序的列表?,但这个答案甚至没有稍微解决这个问题.为什么会被接受? 因为早在 2013 年,这是唯一有帮助的答案。【参考方案3】:

如果您有标准输出重定向到“nohup.out”,只需查看谁使用此文件

lsof | grep nohup.out

【讨论】:

这是一个聪明的方法。但就我而言,这不会返回任何结果。虽然我确定 nohup 命令仍在运行,并且它正在使用 nohup.out 文件。 所有TTY都可以,但是每个nohup都显示双进程! @NabiK.A.Z.来自man lsof:“一般线程和任务会继承调用者的文件,但可能会关闭一些并打开其他文件,因此 lsof 总是报告所有打开的线程和任务文件。”我在它的 man 中找不到关于 nohup 的信息,但它似乎使用了两个线程,而不是一个。 如果输出重定向到一些其他文件将不起作用【参考方案4】:

您无法准确获取以nohup 开头的命令列表,但您可以使用命令ps x 查看它们以及其他进程。以nohup 开头的命令将在 TTY 列中带有问号。

【讨论】:

"ps x" 没有帮助,但我发现 "ps auxw" 有帮助。【参考方案5】:

您也可以只使用 top 命令,您的用户 ID 将指示正在运行的作业及其时间。

$ top

(这将显示所有正在运行的作业)

$ top -U [user ID]

(这将显示特定于用户 ID 的作业)

【讨论】:

此外,这样做的好处是它会留在您的控制台上,这样您就可以观看工作并知道它何时完成

以上是关于如何获取使用 nohup 运行的程序列表的主要内容,如果未能解决你的问题,请参考以下文章

markdown 如何在不获取nohup.out的情况下使用nohup命令?

sh 如何在不获取nohup.out的情况下使用nohup命令?

如何使用 PowerShell 或 VBScript 获取正在运行的应用程序列表

如何使用 JDBC 获取正在运行的语句列表

OSX 内置强制退出应用程序如何获取其应用程序列表?

如何使用列表框获取输入值?