下面我有两条命令但我不知道它们在做什么。
这些命令分别起什么作用?
kill -USR1 %1
kill $(pidof vlc)
答案1
kill -USR1 %1
将“用户定义信号 #1”(又名“SIGUSR1”)发送到当前 shell 进程的第一个后台子进程。如果该后台进程已为 USR1 信号设置了信号处理程序函数,则将运行该函数。如果目标进程没有该信号的信号处理程序,则目标进程将终止。
kill $(pidof vlc)
向进程发送“终止”(SIGTERM)信号vlc
。
让我们来看看OP在另一个答案的评论中描述的完整场景:
用户在其桌面上打开一个带有 Unix shell 的新窗口,并启动以下两个程序:
emacs &
这将在后台启动 Emacs 文本编辑器,使其成为第一个后台作业 (%1)。
vlc ti2_intro.mp4
这将在前台启动 VLC 视频播放器来播放视频ti2_intro.mp4
。
播放 Videoti2_intro.mp4 时,用户在 shell 窗口中按下 Ctrl-z。
这会中断前台子进程,即 VLC。这意味着 VLC 已暂时停止但并未终止。它处于挂起状态。它现在是进程%2
。
现在她发出了 shell 命令
jobs
,
这样她就能看到哪些子进程附加到了这个 shell 进程上。它可能emacs
列为%1
,vlc
以及%2
其次是:
bg %2
这会在后台恢复 VLC,以便视频仍可播放,而无需占用 shell,因此她可以在播放时发出更多 shell 命令。
kill -USR1 %1
这会将“用户定义信号 1”发送到emacs
。Emacs 允许用户定义自己的信号处理程序,因此如果不知道 Emacs 设置的详细信息,就很难知道此信号的作用。它通常用于触发 Emacs“elisp”Lisp 编程环境中的调试器。
过了一会儿,她给出了 shell 命令 [我认为 OP 这里漏掉了一个命令?] 然后按下 Ctrl-c。
目前尚不清楚 OP 可能在这里遗漏了什么命令,但我猜她运行了一个没有立即退出的命令,然后使用 Ctrl-c 退出它。
此后不久,她在同一个 Shell 窗口中输入以下命令:
kill $(pidof vlc)
这将终止 VLC 进程。
答案2
kill 终止列出的进程(或向该进程发送信号要求其终止自身)。
在第一种情况下,会向进程发送一个信号,要求它终止自身(只有在经过编码后,它才会执行此操作 - 这样编码的程序将自行清理并退出)。 %1 表示“job1”,Job1 是一个在后台运行并与当前会话关联的进程(请参阅kill %1 是什么意思)
在第二种情况下,该命令查找 vlc 的进程 ID 并终止它们。