工作处理

创造就业机会

要创建作业,只需在命令后附加一个 &

$ sleep 10 &
[1] 20024

你还可以通过按 Ctrl + 使正在运行的进程成为作业 z :

$ sleep 10
^Z
[1]+  Stopped                 sleep 10

背景和前景一个过程

要将 Process 置于前台,命令 fg%一起使用

$ sleep 10 &
[1] 20024

$ fg %1
sleep 10

现在你可以与流程进行交互。要将其恢复到后台,你可以使用 bg 命令。由于占用终端会话,你需要先按 Ctrl + 停止该过程 z。

$ sleep 10
^Z
[1]+  Stopped              sleep 10

$ bg %1
[1]+ sleep 10 &

由于某些程序员的懒惰,如果只有一个进程,或者对于列表中的第一个进程,所有这些命令也可以使用单个%。例如:

$ sleep 10 &
[1] 20024

$ fg %        # to bring a process to foreground 'fg %' is also working.
sleep 10

要不就

$ %           # laziness knows no boundaries, '%' is also working.
sleep 10

此外,只需键入 fgbg 而不需要任何参数即可处理上一个作业:

$ sleep 20 &
$ sleep 10 &
$ fg
sleep 10
^C
$ fg
sleep 20

杀死正在运行的工作

$ sleep 10 &
[1] 20024

$ kill %1
[1]+  Terminated              sleep 10

睡眠过程在后台运行,进程 ID 为(pid)20024,作业号为 1。要引用该过程,你可以使用 pid 或作业号。如果你使用作业编号,则必须在其前面添加%kill 发送的默认 kill 信号是 SIGTERM,它允许目标进程正常退出。

一些常见的杀伤信号如下所示。要查看完整列表,请运行 kill -l

信号名称 信号值 影响
SIGHUP 1 挂断
SIGINT 2 键盘中断
SIGKILL 9 杀死信号
SIGTERM 15 终止信号

启动并终止特定进程

杀死正在运行的进程的最简单方法可能是通过进程名称选择它,如下例所示,使用 pkill 命令

pkill -f test.py

(或)使用 pgrep 搜索实际进程 ID 的更简单方法

kill $(pgrep -f 'python test.py')

使用 grep over ps -ef | grep name_of_process 可以获得相同的结果,然后杀死与得到的 pid 相关的过程(进程 id)。在测试环境中使用其名称选择进程非常方便,但在生产中使用脚本时可能非常危险:实际上不可能确定名称是否与你实际想要杀死的进程相匹配。在这些情况下,以下方法实际上是安全的。

使用以下方法启动最终将终止的脚本。让我们假设你要执行并最终杀死的命令是 python test.py

#!/bin/bash

if [[ ! -e /tmp/test.py.pid ]]; then   # Check if the file already exists
    python test.py &                   #+and if so do not run another process.
    echo $! > /tmp/test.py.pid
else
    echo -n "ERROR: The process is already running with pid "
    cat /tmp/test.py.pid
    echo
fi

这将在/tmp 目录中创建一个包含 python test.py 进程的 pid 的文件。如果文件已存在,我们假设该命令已在运行且脚本返回错误。

然后,当你想杀死它时,使用以下脚本:

#!/bin/bash

if [[ -e /tmp/test.py.pid ]]; then   # If the file do not exists, then the
    kill `cat /tmp/test.py.pid`      #+the process is not running. Useless
    rm /tmp/test.py.pid              #+trying to kill it.
else
    echo "test.py is not running"
fi

这将完全杀死与你的命令关联的进程,而不依赖于任何易失性信息(如用于运行命令的字符串)。即使在这种情况下,如果文件不存在,脚本也会假定你要终止未运行的进程。

最后一个示例可以轻松改进,以便多次运行相同的命令(例如,附加到 pid 文件而不是覆盖它),并管理进程在被杀死之前死亡的情况。