如何判断之前的命令是否成功执行。
我知道一种方法是使用echo $?
命令:
[username@hostname ~]$ echo $?
0
但是像这样的场景呢:假设我想运行一个名为“ROSE_main.py”的 python 脚本
[username@hostname rose]$ python ROSE_main.py -g HG18 -i HG18_MM1S_MED1.gff -r MM1S_MED1.hg18.bwt.sorted.bam -c MM1S_WCE.hg18.bwt.sorted.bam -o example -s 12500 -t 2500
USING HG18_MM1S_MED1.gff AS THE INPUT GFF
USING HG18 AS THE GENOME
MAKING START DICT
LOADING IN GFF REGIONS
CHECKING INPUT TO MAKE SURE EACH REGION HAS A UNIQUE IDENTIFIER
REFERENCE COLLECTION PASSES QC
STITCHING REGIONS TOGETHER
PERFORMING REGION STITCHING
REMOVED 7865 LOCI BECAUSE THEY WERE CONTAINED BY A TSS
...
该命令似乎永远被执行。当我在新水龙头中使用“top”命令时,我看到的是:
315 root RT 0 0 0 0 S 100.0 0.0 1801:10 migration/104
42 root RT 0 0 0 0 S 100.0 0.0 2023:48 migration/13
177 root RT 0 0 0 0 S 100.0 0.0 1622:39 migration/58
51 root RT 0 0 0 0 S 100.0 0.0 1820:09 migration/16
66 root RT 0 0 0 0 R 100.0 0.0 2135:56 migration/21
462 root RT 0 0 0 0 R 100.0 0.0 1696:18 migration/153
63 root RT 0 0 0 0 S 100.0 0.0 1735:34 migration/20
54 root RT 0 0 0 0 S 100.0 0.0 1844:20 migration/17
429 root RT 0 0 0 0 S 100.0 0.0 1690:33 migration/142
11471 gdm 20 0 374m 12m 4544 R 117.1 0.0 934:51.45 gnome-settings-
318 root RT 0 0 0 0 S 100.0 0.0 1774:44 migration/105
我想如果命令仍在运行,我应该能够看到我的用户名和类似“python”之类的东西,但是,我没有看到任何类似的东西。
当我来到命令点击时,光标一直在闪烁,所以命令仍在执行,怎么可能?
我如何知道该命令是否仍在运行?
top
命令没有给我任何信息。我也不能使用echo $?
(如果我尝试输入echo $?
,我会得到一些反馈,例如pipeline broken
)
答案1
如果命令失败,您将返回 shell 提示符,无论是否有错误消息。
所以无论如何,它仍然在运行。但就你而言,它似乎正在等待来自终端的输入。这通常意味着它将永远不会结束,除非你给它它正在等待的输入。
无论如何,top
都不是正确的工具。它旨在显示排名靠前的进程 - 或者是使用最多 CPU、最多内存等的进程 - 并且您的命令不一定是在排序top
依据的任何类别中排名最高的进程之一。
查看命令状态的正确工具是ps
.您可以使用ps
显示系统中的所有进程(使用-e
)、仅显示您自己(或特定用户)的进程(使用-U
)或特定进程。其他参数ps
定义其格式。所以在你的情况下你可以使用
ps -lf $(pgrep python)
查看头命令为 的所有进程python
。
它-lf
为您提供了有关每个此类进程的大量信息 - 其中包括进程的状态(在列下S
),如果它当前正在睡眠而不是运行,则系统调用它已停止的位置(WCHAN
)。
如果该命令正在运行,而不是等待,您会R
在该S
列中看到 ,并-
在该WCHAN
列中看到。如果它正在等待某些内容,您会S
在该S
列中看到 ,以及类似wait_w
、poll_s
等futex_
的内容WCHAN
。
很难确切地说出它在等待什么,但是如果您发现它长时间处于该状态并且您期望它开始运行,则应该检查命令本身以查看是否正确运行了它。
阅读ps
手册以获取有关可能的格式以及您可以在其输出中看到的内容的更多详细信息。
至于你的 python 命令,你应该检查它为什么等待用户输入。