如何找出自己执行的后台工作

时间:2016-01-20 03:58:45

标签: linux ubuntu

我们可以使用&让bash在后台执行,例如livereload &php -S localhost:8000 &,但如果我离开终端并忘记杀死程序,它将始终是直到重新启动,我可以使用命令jobs检查我执行了哪个bash,但是如果我打开一个新终端或再次登录,jobs -l将为空,谁在登录时找到它时间。

1 个答案:

答案 0 :(得分:4)

如果您使用&,则会将流程置于后台;但是,该进程仍然附加到该特定终端(更具体地说,是执行该命令的活动shell)。当您退出该终端(或退出该shell)时,该进程将被终止。 (见:https://unix.stackexchange.com/questions/86247/what-does-ampersand-mean-at-the-end-of-a-shell-script-line

进程在退出该shell时不会被杀死的情况是当进程分叉子进程时,该子进程现在由init(PPID 1)拥有。 livereload &可能就是这种情况。

您还可以通过点击Ctrl-Z将当前正在前台运行的流程放到后台,这会将您带回shell,同时暂停(不会终止)该流程,然后输入{{1}然后,它将在后台继续执行该过程。

当您运行bg时,或者当您使用<cmd> &Ctrl-z将流程移至后台时,您可以将其恢复到前台输入bg。此时,您可以使用fg将其杀死。

但是,一般情况下,要查找已分离的进程,可以使用

Ctrl-c

如果您想查看其他用户&#39;您希望在

中添加ps -f | grep <name of the command> | grep -v grep -e
-a

ps -eaf | grep <name of the command> | grep -v grep

(注意:ps aux | grep <name of the command> | grep -v grep 部分将删除执行grep -v grep命令的进程。)

现在,要从shell分离进程,您可以使用以下几个实用程序之一:

编辑:如果你不记得你在后台放置的内容,并且这些进程已从你当前的shell分离(或者可能正在捕获挂起信号),你可以{{ 1}}来自您的tmux,看看您是否可以在

的活动流程中找到它
grep

这种单行程的工作方式是history你的历史记录,其结尾有history | grep "&$" | sed "s/&//g" | sed "s/^[ \t]*[0-9]*//g" | sed "s/^[ \t]*//g" | xargs -d '\n' pgrep - 例如,

grep

然后将其传递给&并删除尾随的&符号。它通过sed再传递两次以删除起始编号(即历史记录中的命令编号)并启动空格。然后使用898 my_script & # <----- you'll only see lines like this 899 ls 900 sleep 10000 & # <----- you'll only see lines like this 901 pwd 来查看活动进程。输出(对我而言,sed为90448

pgrep

现在,您甚至可以再次将其导入sleep 10000 &以杀死这些进程(如果您确信它们是正确的)。如果您想验证,可以运行

mgr@tesla:~$ ps aux | grep sleep
mgr             91040   0.0  0.0  2434836    756 s002  S+    9:37AM   0:00.00 grep sleep
mgr             90448   0.0  0.0  2434820    340 s002  S     9:24AM   0:00.00 sleep 100000
mgr@tesla:~$ history | grep "&$" | sed "s/&//g" | sed "s/^[ \t]*[0-9]*//g" | sed "s/^[ \t]*//g" | xargs pgrep
90448

xargs