侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux setsid命令教程:如何在新会话中运行程序(附案例详解和注意事项)

在Linux系统中,setsid命令是用来运行程序并在新的会话中分配新的进程组和会话ID。这个命令通常用于从终端分离进程,使之在后台运行。

Linux setsid命令介绍

setsid,全称为 Set Session ID,主要用于创建一个新的会话,并使调用的进程成为该会话的首领。这意味着它会开始一个新的进程组,使得该进程和子进程与原来的控制终端分离。

Linux setsid命令适用的Linux版本

setsid命令在大多数Linux发行版中都是可用的,因为它是util-linux包的一部分,这个包在大多数发行版中都是预安装的。以下是一些常见发行版的setsid安装方法:

# 基于apt的发行版(如Debian、Ubuntu、Raspbian、Kali Linux等):
sudo apt-get update && sudo apt-get install util-linux

# 基于yum的发行版(如RedHat,CentOS 7等):
sudo yum update && sudo yum install util-linux

# 基于dnf的发行版(如Fedora,CentOS 8等):
sudo dnf update && sudo dnf install util-linux

# 基于apk的发行版(如Alpine Linux):
sudo apk add util-linux

# 基于pacman的发行版(如Arch Linux):
sudo pacman -Syu util-linux

# 基于zypper的发行版(如openSUSE):
sudo zypper ref && sudo zypper in util-linux

# 基于pkg的FreeBSD发行版
sudo pkg update && sudo pkg install util-linux

# 基于pkg的OS X/macOS发行版:
brew update && brew install util-linux

如果出现bash: setsid: command not found,请根据您的Linux发行版使用上述相应的命令进行安装。

Linux setsid命令的基本语法

语法格式:

setsid [选项] 程序 [参数...]

Linux setsid命令的常用选项或参数说明

选项描述
-c从当前控制终端分离
-f强制运行程序
-w等待程序运行结束
不接受任何特定的选项,直接跟随被执行的命令和参数

Linux setsid命令实例详解

实例1:在新会话中启动进程

使用setsid命令在新会话中启动一个进程。

[linux@bashcommandnotfound.cn ~]$ setsid sleep 100

这个命令会在新的会话中启动sleep命令,并使其睡眠100秒。

实例2:在后台启动进程并与终端分离

使用setsid命令启动一个进程,并使其与控制终端分离,继续在后台运行。

[linux@bashcommandnotfound.cn ~]$ setsid top -b > top-output.txt &

这个命令将在后台运行top,并将输出重定向到top-output.txt文件中。

实例3:使用-w选项等待进程完成

使用setsid命令启动进程,并等待该进程完成。

[linux@bashcommandnotfound.cn ~]$ setsid -w ls -l > ls-output.txt

这个命令会在新的会话中执行ls -l,并将输出保存到ls-output.txt,同时等待命令执行完成。

示例4:在新会话中启动网页服务器

假设你有一个名为my_web_server的网页服务器可执行文件,你想在后台运行它,并确保即使你从shell注销后,它也能继续运行。

[linux@bashcommandnotfound.cn ~]$ setsid my_web_server &

这个命令将my_web_server启动在一个新的会话中。命令末尾的&将命令放到后台,这样你就可以继续使用shell。当你注销时,网页服务器不会被终止,因为它运行在一个单独的会话中。

示例5:运行一个没有控制终端的脚本

想象一下,你有一个名为backup.sh的脚本,用于执行系统备份,你希望运行它时不连接到控制终端,以防止你意外关闭终端时中断它。

[linux@bashcommandnotfound.cn ~]$ setsid ./backup.sh </dev/null &>/dev/null &

在这个命令中,</dev/null将标准输入从终端断开,&>/dev/null将标准输出和标准错误重定向到/dev/null(有效地丢弃所有输出),最后一个&将进程放到后台。

示例6:确保一个进程不是会话领导者

有时你可能需要确保一个进程不是会话领导者,这是它能够获得新控制终端的先决条件(这通常与守护进程相关)。

[linux@bashcommandnotfound.cn ~]$ setsid sh -c 'exec sleep 1000' &

这个示例使用sh -c在新的shell实例中执行sleep命令,并且exec内建命令用sleep替换了shell,确保sleep不是会话领导者。

示例7:使用nohup创建一个安全的后台进程

nohup命令经常与setsid一起使用,以确保当shell退出时进程不会终止,并且不会接收到SIGHUP信号。

[linux@bashcommandnotfound.cn ~]$ setsid nohup long-running-process &

在这个例子中,long-running-process是你实际长时间运行的命令或脚本的占位符。nohup命令使其对挂断信号免疫,而setsid将它放入一个新的会话。

示例8:在脚本中使用setsid

假设你正在编写一个名为daemon_launcher.sh的脚本,它启动了几个应该独立于终端会话运行的守护进程。

#!/bin/bash
setsid /path/to/daemon1 &
setsid /path/to/daemon2 &
setsid /path/to/daemon3 &

每个守护进程都使用setsid在它自己的会话中启动,确保它们将继续作为后台进程运行,无论脚本的终端会话如何。

示例9:启动服务的多个实例

如果你需要启动监听不同端口的服务的多个实例,你可以在循环中使用setsid

[linux@bashcommandnotfound.cn ~]$ for port in {7000..7003}; do setsid my_service -p $port & done

这个循环将启动四个my_service的实例,每个实例监听从7000到7003的不同端口。

Linux setsid命令的注意事项

  • 当使用 setsid 时,启动的进程会成为新会话的首领。该会话没有控制终端,这意味着即使你关闭了启动进程的终端,该进程也不会被终止。
  • 注意,如果你的shell已经是会话首领,那么 setsid 命令可能不会产生新的会话。在这种情况下,你可以使用 exec setsid <command> 来确保创建新会话。
  • 如果你使用 -w 选项,setsid 将等待执行的命令完成。如果命令长时间运行或永远不会自行结束(例如,某些服务器进程),那么不应使用 -w 选项。
  • 使用 setsid 的一个常见用途是编写脚本,以确保在脚本运行时启动的进程能够继续运行,即使脚本所在的终端会话结束。
  • setsid 在脚本中特别有用,用于创建守护进程。但是,请记住配置适当的日志记录,因为一旦从终端分离,你将无法通过标准输出来看到进程的输出。
  • 使用 setsid 时,确保理解进程和作业控制的概念,因为它们对于正确使用此命令至关重要。
0

评论区