将进程从当前会话中分离
在这一步中,我们将学习如何使用 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 来运行后台进程。