Linux命令-setsid运行程序于新的会话快速参考基本语法安装 setsid常用选项实际应用场景setsid 与 nohup/ disown 对比在脚本中使用 setsid停止由 setsid 启动的进程故障排查总结快速参考setsid用于在新会话session中运行程序使程序脱离当前终端成为守护进程daemon。setsid通过调用setsid()系统调用使程序脱离当前终端的控制即使终端关闭程序也会继续运行。核心场景将前台程序转为后台守护进程脱离终端控制。基本语法# 基本语法setsid[选项]程序[参数...]# 在新会话中运行程序setsidsleep3600# 运行程序并输出到日志setsid myserver/var/log/myserver.log21安装 setsid# setsid 是 util-linux 包的一部分通常已预装# 如果未安装可以手动安装# Debian/Ubuntusudoaptupdatesudoaptinstallutil-linux# RHEL/CentOSsudoyuminstallutil-linux# Arch Linuxsudopacman-Sutil-linux# 验证安装whichsetsid setsid--version常用选项# -c, --close-all-files 关闭所有文件描述符setsid-cmyprogram# -f, --no-fork 不 fork直接替换当前进程不常用setsid-fmyprogram# -w, --wait 等待程序退出返回退出码setsid-wmyprogram# --help 显示帮助setsid--help# --version 显示版本setsid--version实际应用场景# 场景1手动将程序转为守护进程 # 问题运行前台程序关闭终端后程序退出# 解决使用 setsid# 错误做法sleep3600# 虽然后台运行但终端关闭后仍然会收到 SIGHUP# 正确做法setsidsleep3600# 现在即使关闭终端sleep 也会继续运行# 场景2启动服务器程序 # 启动一个简单的 HTTP 服务器Pythonsetsid python3-mhttp.server8080/var/log/py_http.log21# 验证psaux|grephttp.server# 场景3在脚本中创建守护进程 #!/bin/bash# 守护进程脚本示例LOG_FILE/var/log/mydaemon.log# 使用 setsid 启动守护进程setsid ./mydaemon$LOG_FILE21DAEMON_PID$!echo守护进程已启动PID:$DAEMON_PIDecho日志文件:$LOG_FILE# 场景4配合 nohup 使用 # nohup 也可以实现类似功能但 setsid 更彻底创建新会话# 使用 nohupnohupsleep3600# 使用 setsid更推荐setsidsleep3600setsid 与 nohup/ disown 对比# nohup忽略 SIGHUP 信号 # 优点简单# 缺点仍然在同一个会话中不是真正的守护进程nohupmyprogram# disown从 Shell 的作业表中移除 # 优点可以事后将程序转为后台# 缺点依赖于 Shell不适合脚本sleep3600disown# setsid创建新会话真正的守护进程# 优点彻底脱离终端适合脚本# 缺点命令稍复杂setsid myprogram# 总结 # 交互式使用 nohup 或 disown# 脚本中使用 setsid推荐# 需要输出日志setsid配合重定向在脚本中使用 setsid#!/bin/bash# 使用 setsid 创建守护进程的完整脚本DAEMRON_NAMEmydaemonDAEMRON_BIN/usr/local/bin/$DAEMRON_NAMEPID_FILE/var/run/$DAEMRON_NAME.pidLOG_FILE/var/log/$DAEMRON_NAME.log# 检查是否已在运行if[-f$PID_FILE];thenOLD_PID$(cat$PID_FILE)ifps-p$OLD_PID/dev/null21;thenecho错误$DAEMRON_NAME已在运行 (PID:$OLD_PID)exit1elseecho警告PID 文件存在但进程不存在清理...rm-f$PID_FILEfifi# 使用 setsid 启动守护进程echo正在启动$DAEMRON_NAME...setsid$DAEMRON_BIN$LOG_FILE21DAEMRON_PID$!echo$DAEMRON_PID$PID_FILEecho守护进程已启动PID:$DAEMRON_PIDecho日志文件:$LOG_FILEecho使用 kill$DAEMRON_PID停止守护进程停止由 setsid 启动的进程# 1. 查看进程psaux|grepmyprogram# 2. 获取 PIDPID$(pgrep myprogram)# 3. 停止进程kill$PID# 4. 如果无法停止强制终止kill-9$PID故障排查# 问题1setsid 后程序仍然退出# 原因程序自身有退出逻辑如配置文件错误# 解决查看程序日志tail-f/var/log/myprogram.log# 问题2setsid 后无法停止进程# 原因没有记录 PID# 解决使用 PID 文件记录setsid myprogramecho$!/var/run/myprogram.pid# 停止时kill$(cat/var/run/myprogram.pid)# 问题3setsid 不生效# 原因程序主动退出新会话# 解决检查程序是否调用了 setsid() 自身总结核心价值setsid是将程序转为守护进程的基础工具通过创建新会话使程序彻底脱离终端。最佳实践使用setsid program 启动守护进程配合日志重定向 log 21记录 PID 到文件echo $! pid.file在脚本中使用setsid而非nohup常用组合setsid program 启动守护进程setsid -w program等待程序退出setsid program log 21 重定向日志注意setsid仅是创建守护进程的第一步完整的守护进程还需要处理信号、关闭文件描述符、切换工作目录等。
Linux命令-setsid(运行程序于新的会话)
Linux命令-setsid运行程序于新的会话快速参考基本语法安装 setsid常用选项实际应用场景setsid 与 nohup/ disown 对比在脚本中使用 setsid停止由 setsid 启动的进程故障排查总结快速参考setsid用于在新会话session中运行程序使程序脱离当前终端成为守护进程daemon。setsid通过调用setsid()系统调用使程序脱离当前终端的控制即使终端关闭程序也会继续运行。核心场景将前台程序转为后台守护进程脱离终端控制。基本语法# 基本语法setsid[选项]程序[参数...]# 在新会话中运行程序setsidsleep3600# 运行程序并输出到日志setsid myserver/var/log/myserver.log21安装 setsid# setsid 是 util-linux 包的一部分通常已预装# 如果未安装可以手动安装# Debian/Ubuntusudoaptupdatesudoaptinstallutil-linux# RHEL/CentOSsudoyuminstallutil-linux# Arch Linuxsudopacman-Sutil-linux# 验证安装whichsetsid setsid--version常用选项# -c, --close-all-files 关闭所有文件描述符setsid-cmyprogram# -f, --no-fork 不 fork直接替换当前进程不常用setsid-fmyprogram# -w, --wait 等待程序退出返回退出码setsid-wmyprogram# --help 显示帮助setsid--help# --version 显示版本setsid--version实际应用场景# 场景1手动将程序转为守护进程 # 问题运行前台程序关闭终端后程序退出# 解决使用 setsid# 错误做法sleep3600# 虽然后台运行但终端关闭后仍然会收到 SIGHUP# 正确做法setsidsleep3600# 现在即使关闭终端sleep 也会继续运行# 场景2启动服务器程序 # 启动一个简单的 HTTP 服务器Pythonsetsid python3-mhttp.server8080/var/log/py_http.log21# 验证psaux|grephttp.server# 场景3在脚本中创建守护进程 #!/bin/bash# 守护进程脚本示例LOG_FILE/var/log/mydaemon.log# 使用 setsid 启动守护进程setsid ./mydaemon$LOG_FILE21DAEMON_PID$!echo守护进程已启动PID:$DAEMON_PIDecho日志文件:$LOG_FILE# 场景4配合 nohup 使用 # nohup 也可以实现类似功能但 setsid 更彻底创建新会话# 使用 nohupnohupsleep3600# 使用 setsid更推荐setsidsleep3600setsid 与 nohup/ disown 对比# nohup忽略 SIGHUP 信号 # 优点简单# 缺点仍然在同一个会话中不是真正的守护进程nohupmyprogram# disown从 Shell 的作业表中移除 # 优点可以事后将程序转为后台# 缺点依赖于 Shell不适合脚本sleep3600disown# setsid创建新会话真正的守护进程# 优点彻底脱离终端适合脚本# 缺点命令稍复杂setsid myprogram# 总结 # 交互式使用 nohup 或 disown# 脚本中使用 setsid推荐# 需要输出日志setsid配合重定向在脚本中使用 setsid#!/bin/bash# 使用 setsid 创建守护进程的完整脚本DAEMRON_NAMEmydaemonDAEMRON_BIN/usr/local/bin/$DAEMRON_NAMEPID_FILE/var/run/$DAEMRON_NAME.pidLOG_FILE/var/log/$DAEMRON_NAME.log# 检查是否已在运行if[-f$PID_FILE];thenOLD_PID$(cat$PID_FILE)ifps-p$OLD_PID/dev/null21;thenecho错误$DAEMRON_NAME已在运行 (PID:$OLD_PID)exit1elseecho警告PID 文件存在但进程不存在清理...rm-f$PID_FILEfifi# 使用 setsid 启动守护进程echo正在启动$DAEMRON_NAME...setsid$DAEMRON_BIN$LOG_FILE21DAEMRON_PID$!echo$DAEMRON_PID$PID_FILEecho守护进程已启动PID:$DAEMRON_PIDecho日志文件:$LOG_FILEecho使用 kill$DAEMRON_PID停止守护进程停止由 setsid 启动的进程# 1. 查看进程psaux|grepmyprogram# 2. 获取 PIDPID$(pgrep myprogram)# 3. 停止进程kill$PID# 4. 如果无法停止强制终止kill-9$PID故障排查# 问题1setsid 后程序仍然退出# 原因程序自身有退出逻辑如配置文件错误# 解决查看程序日志tail-f/var/log/myprogram.log# 问题2setsid 后无法停止进程# 原因没有记录 PID# 解决使用 PID 文件记录setsid myprogramecho$!/var/run/myprogram.pid# 停止时kill$(cat/var/run/myprogram.pid)# 问题3setsid 不生效# 原因程序主动退出新会话# 解决检查程序是否调用了 setsid() 自身总结核心价值setsid是将程序转为守护进程的基础工具通过创建新会话使程序彻底脱离终端。最佳实践使用setsid program 启动守护进程配合日志重定向 log 21记录 PID 到文件echo $! pid.file在脚本中使用setsid而非nohup常用组合setsid program 启动守护进程setsid -w program等待程序退出setsid program log 21 重定向日志注意setsid仅是创建守护进程的第一步完整的守护进程还需要处理信号、关闭文件描述符、切换工作目录等。