2011-10-11 75 views
2

我编辑代码和LaTeX,并喜欢定期编译,以检查编辑是否正在做我想做的。我通常运行一个看起来像是“while true; do make -s foo.pdf; sleep 2; done &”的小bash命令行,然后编辑foo.tex并将结果重新加载到xpdf中以检查它。每次我保存我的编辑时,脚本都会生成pdf,我可以检查编辑是否按照他们的要求进行了操作。然而,在我做了几个这样的事情之后,结束我的编辑并继续前进,我有这些仍在运行的小脚本,并且我开始的每个xterm都可能被关闭。 ps只显示脚本的睡眠部分,使得很难知道启动它的正确父项。我怎么知道我看到的所有睡眠中的哪个父母是要杀的人,即如何判断哪个睡眠与我所做的make foo相关联?如何识别正在运行的bash脚本?

+1

William发表了有用的评论,然后再次将其删除!我希望他能把它放回去!他的评论帮助我找到了我的问题的答案,并且我想将它投票,但它已经不存在了!如果我真的是'bash -c';做make -s fah.ps; sleep 21; done'',那么bash命令会在ps中标识它自己!我不应该从终端bash启动脚本,而应该从命令行启动一个bash命令来生成命令! – ChrisDR

回答

0

如果我是bash -c "while true; do make -s foo.ps; sleep 2; done",那么ps显示的bash命令命令具有我需要标识脚本的文件名。所以,不要直接从终端命令行运行脚本,我应该在命令行中使用命令启动bash!感谢威廉(我认为这是Pursell),他的帖子让我想到了正确的路线! Mnm Cee建议使用适当的pid作为锁定文件,但创建这个文件需要比在命令行上轻松完成的更多的输入。可能必须编写一个单独的函数,然后调用它。

1

您可以使用pstree或'ps -afjx',它们都显示进程树,这可以很容易地识别父进程。

您还可以将父PID打印到每个脚本中的tmp文件中 - 并在脚本完成后删除该文件。

+0

我可以很容易地识别父母,因为他们在运行过程中显示。我希望能够看到与睡眠相关的待处理或过去的处理,这些处理没有,或者至少我不知道如何看待它们。 – ChrisDR

+0

显然,在创建它们之前您无法看到“待处理”进程,也无法在它们死后看到“过去”进程。但是,您可以在'ps'列表中看到每个进程的父进程ID – 2011-11-16 13:38:30

1

如果您经常使用该scriptlet,请将其放入脚本中。然后,您可以在进程列表中标识脚本名称。

0

在您输入命令的shell中,只需输入jobs,while循环应显示在列表中。假设括号中的作业号码是3,然后输入kill %3来杀死它。

或者,在您的ps标志中包含jps j可能是最方便的,因为它也会选择BSD默认选择的所有进程都有终端),请注意进程组ID(PGID),例如1234 ,然后做kill -- -1234