我需要运行一个进程,但不能使用&
... 但可以通过 运行tmux
。脚步:
- 终端 SSH 连接到服务器计算机。
tmux
- 运行应用程序...然后等待...哎呀,超时...
如何 (最简单的方法)返回应用程序,查看其余日志?
答案1
您可以在重新连接到远程服务器时列出 tmux 会话:
tmux ls
0: 4 windows (created Tue Oct 15 07:55:07 2019) [255x62]
1: 2 windows (created Tue Oct 15 07:55:07 2019) [255x62]
然后您可以重新附加到目标会话:
tmux attach-session -t 1
这将附加到上面列出的第二个 tmux 实例。
如果您只运行一个 tmux 会话,那么您可以使用简写:
tmux a
重新连接第一个会话。
答案2
如果您容易挂起或想要离开 -session ssh
,您可以使用nohup
。这允许您将进程与会话分离ssh
,在后台运行它并将输出保存到文件中。
nohup COMMAND &
默认输出到$HOME/nohup.out
,或者可以进行重定向
nohup COMMAND > mylogs.log &
当您运行 nohup 时,您将看到PID
进程的信息,例如:
$ nohup bash -c "while ((1)) ; do echo 1 ; sleep 1 ; done" > echo.log &
[1] 21816
请注意 PID 并通过例如检查进程的状态ps <PID>
$ps 21816
PID TTY STAT TIME COMMAND
21846 pts/6 S 0:00 bash -c while ((1)) ; do echo 1 ; sleep 1 ; done
给定的没有输出PID
意味着该进程不再活动(取消、中止、停止、完成......等等)。
答案3
假设出于演示目的,您想在远程主机上运行它:
for i in $(seq 60) ; do
echo "$i seconds of 60"
sleep 1
done
....并希望它在 ssh 连接中断时继续运行。
这最简单的方法我能想到用 tmux 来做到这一点是:
tmux new-session -d
tmux new-window bash -c 'for i in $(seq 60) ; do echo "$i seconds of 60" ; sleep 1 ;done'
之后您将返回 shell 提示符,就好像什么也没发生一样。但脚本将在内存中的 tmux 中运行。如果您退出 shell(或者您的 ssh 连接中断),它将继续运行。
要连接到 tmux 会话以查看终端中运行的程序,请运行以下命令:
tmux attach-session
要离开 tmux 会话并使其在后台运行,请ctrl-b
依次点击d
。
exit
要终止 tmux 会话,只需连接到它,如果程序仍在shell中以正常方式运行,则终止程序。或者从 tmux 会话外部:
tmux kill-session