我们可以使用&
让bash在后台执行,例如livereload &
,php -S localhost:8000 &
,但如果我离开终端并忘记杀死程序,它将始终是直到重新启动,我可以使用命令jobs
检查我执行了哪个bash,但是如果我打开一个新终端或再次登录,jobs -l
将为空,谁在登录时找到它时间。
答案 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分离进程,您可以使用以下几个实用程序之一:
screen
grep
- 与nohup
一样,会捕获该过程的挂断信号(有关详细信息,请参阅:What's the difference between nohup and ampersand)nohup <CMD> &
(参见:https://superuser.com/questions/236158/tmux-vs-screen) 编辑:如果你不记得你在后台放置的内容,并且这些进程已从你当前的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