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