我编辑代码和LaTeX,并喜欢定期编译以检查编辑是否正在执行我想要的操作。我经常运行一个看起来像"的小bash命令行,而true;做make -s foo.pdf;睡2;完成&",然后编辑foo.tex并在xpdf中重新加载结果以进行检查。每次我保存编辑时,脚本都会生成pdf,我可以检查我的编辑是否符合他们的要求。但是,在我完成其中的几个操作之后,结束我的编辑并继续前进,我有一些仍然在运行的小脚本,并且我在每个脚本中启动的xterm可能会被关闭。 ps只显示脚本的睡眠部分,因此很难知道启动它的正确父级。我怎么知道我看到的所有睡眠中的哪一个是要杀死的那个,也就是说,如何判断哪个睡眠与我所做的make foo有关?
答案 0 :(得分:1)
你可以使用pstree或'ps -afjx',它们都显示一个进程树,这样可以很容易地识别父进程。
您还可以将父PID打印到每个脚本中的tmp文件中 - 并在脚本完成后删除该文件。
答案 1 :(得分:1)
如果经常使用该scriptlet,请将其放在脚本中。然后,您可以在进程列表中标识脚本名称。
答案 2 :(得分:0)
如果我bash -c "while true; do make -s foo.ps; sleep 2; done"
,则ps
显示的bash命令命令具有识别脚本所需的文件名。因此,我应该在命令行中使用命令启动bash
,而不是直接从终端命令行运行脚本!感谢威廉(我认为这是Pursell),他的帖子让我思考正确的路线! Mnm Cee建议使用带有适当pid的锁文件,但是创建它会比在命令行上轻松完成更多的输入。可能必须编写一个单独的函数,然后调用它。
答案 3 :(得分:0)
在输入命令的shell中,只需键入jobs
,while循环就会出现在列表中。假设括号中的作业号是3,然后键入kill %3
来终止它。
或者,在ps标志中包含j
(ps j
可能是最方便的,因为它也会选择BSD默认选择所有具有终端的进程),记下进程组ID( PGID),说它是1234,然后做kill -- -1234
。