Linux setsid 命令及实际示例

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将探索 Linux 的 setsid 命令,并学习如何使用它将进程从当前会话中分离并在后台运行。setsid 命令会创建一个新的会话,并将调用进程作为会话领导者,从而使该进程能够独立运行,不受当前会话的信号或终端输入/输出的影响。我们将首先了解 setsid 命令,然后演示如何有效地使用它来运行后台进程。

本实验涵盖以下步骤:

  • 理解 setsid 命令
  • 将进程从当前会话中分离
  • 使用 setsid 运行后台进程

setsid 命令是 Linux 中管理进程的有用工具,本实验提供了实际示例,帮助你理解并将其应用到日常工作中。

Linux 命令速查表


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux/BasicSystemCommandsGroup -.-> linux/sleep("Execution Delaying") linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/SystemInformationandMonitoringGroup -.-> linux/ps("Process Displaying") subgraph Lab Skills linux/sleep -.-> lab-422913{{"Linux setsid 命令及实际示例"}} linux/cat -.-> lab-422913{{"Linux setsid 命令及实际示例"}} linux/ps -.-> lab-422913{{"Linux setsid 命令及实际示例"}} end

理解 setsid 命令

在这一步中,我们将探索 Linux 中的 setsid 命令,它用于将进程从当前会话中分离并在后台运行。

setsid 命令会创建一个新的会话,并将调用进程作为会话领导者。这意味着该进程将与当前会话隔离,并且不会受到当前会话的信号或终端输入/输出的影响。

让我们从使用 setsid 运行一个简单的命令开始:

setsid sleep 60

这将在新会话中运行 sleep 60 命令,即使你关闭当前终端,该进程仍会继续运行。

示例输出:

[1] 1234

输出显示了 sleep 命令的进程 ID (PID),该进程正在后台运行。

现在,让我们验证该进程是否在一个独立的会话中运行:

ps -o sid,pid,cmd | grep sleep

示例输出:

  1234 1234 sleep 60

ps 命令显示 sleep 进程的会话 ID (SID) 与当前会话不同。

在下一步中,我们将学习如何更有效地使用 setsid 来运行后台进程。

将进程从当前会话中分离

在这一步中,我们将学习如何使用 setsid 命令将进程从当前会话中分离。

当你希望运行一个长时间运行的进程,并且不希望它受到当前会话的信号或终端输入/输出的影响时,将进程从当前会话中分离非常有用。

让我们从使用 setsid 运行一个简单的命令开始:

setsid bash -c 'sleep 60 && echo "Process completed"'

这将在新会话中运行 sleep 60 命令,即使你关闭当前终端,该进程仍会继续运行。echo "Process completed" 命令将在 sleep 命令完成后执行。

示例输出:

[1] 1234

输出显示了 sleep 命令的进程 ID (PID),该进程正在后台运行。

现在,让我们验证该进程是否在一个独立的会话中运行:

ps -o sid,pid,cmd | grep sleep

示例输出:

  1234 1234 sleep 60

ps 命令显示 sleep 进程的会话 ID (SID) 与当前会话不同。

要检查分离进程的输出,我们可以使用 ps 命令查找进程的 PID,然后使用 cat 命令从 /proc/<PID>/fd/1 文件(表示进程的标准输出)中读取输出:

pid=$(ps -o pid,cmd | grep 'sleep 60' | awk '{print $1}')
cat /proc/$pid/fd/1

示例输出:

Process completed

这表明 echo "Process completed" 命令在 sleep 命令完成后被执行。

在下一步中,我们将学习如何更有效地使用 setsid 来运行后台进程。

使用 setsid 运行后台进程

在这最后一步中,我们将学习如何使用 setsid 命令在 Linux 中有效地运行后台进程。

setsid 的一个常见用例是运行长时间运行的后台进程,而不受当前会话的影响。当你需要运行一个即使在你退出系统后仍应继续运行的进程时,这尤其有用。

让我们尝试一个示例:

setsid bash -c 'while true; do echo "Running in the background" >> ~/project/output.txt; sleep 5; done'

这将启动一个后台进程,每 5 秒将 "Running in the background" 写入 ~/project 目录下名为 output.txt 的文件中。

示例输出:

[1] 1234

输出显示了后台进程的进程 ID (PID)。

现在,让我们验证该进程是否在一个独立的会话中运行,以及输出文件是否正在生成:

ps -o sid,pid,cmd | grep 'while true'
cat ~/project/output.txt

示例输出:

  1234 1234 bash -c 'while true; do echo "Running in the background" >> ~/project/output.txt; sleep 5; done'
Running in the background
Running in the background
Running in the background

ps 命令显示该进程正在一个独立的会话中运行,而 cat 命令显示了 output.txt 文件的内容,该文件正在被后台进程持续更新。

即使你关闭当前终端,后台进程仍会继续运行并更新 output.txt 文件。你可以稍后检查该文件以查看输出。

在本实验中,我们学习了如何使用 setsid 命令将进程从当前会话中分离并在后台运行。这是在 Linux 中管理长时间运行进程的有用技术。

总结

在本实验中,我们探索了 Linux 中的 setsid 命令,它用于将进程从当前会话中分离并在后台运行。我们了解到,setsid 会创建一个新的会话,并将调用进程作为会话领导者,从而使该进程与当前会话及其信号或终端输入/输出隔离。我们演示了如何使用 setsid 在后台运行一个简单的 sleep 命令,并验证了该进程是否在一个独立的会话中运行。此外,我们还学习了如何使用 setsid 将进程从当前会话中分离,使得长时间运行的进程即使关闭当前终端也能继续运行。

Linux 命令速查表