例如需要让rsync同步的时候关闭终端也能继续运行
在启动rsync
命令后直接关闭终端窗口一般会导致rsync
进程终止,因为当终端关闭时,它会发送一个SIGHUP信号到与它相关联的子进程,这通常会结束这些进程。
如果您想要在关闭终端窗口后让rsync
继续运行,可以使用几种方法
1、使用nohup
命令:
nohup rsync -avzhP -e "ssh -p SSH_PORT" LOCAL_DIRECTORY USER@REMOTE_HOST:REMOTE_DIRECTORY &
这里的nohup
命令会使rsync
忽略SIGHUP信号,而&
将rsync
置于后台执行。
2、使用screen
或tmux
等终端复用器: 这些工具可以创建一个持久的会话,即使您断开了与会话的连接,会话中运行的程序也会继续运行。
使用screen
的话,可以这样做:
screen -S rsync_session
rsync -avzhP -e "ssh -p SSH_PORT" LOCAL_DIRECTORY USER@REMOTE_HOST:REMOTE_DIRECTORY
然后你可以按Ctrl-A
然后按D
来脱离screen
会话,rsync
会继续在screen
会话内运行。
3、使用at
或batch
命令:
这些命令可以在特定时间安排命令执行,而batch
会在系统负载下降到特定水平时执行。这些通常用于计划任务,但也可以用于确保任务在关闭终端后继续运行。
在使用nohup
时,所有输出默认会被重定向到nohup.out
文件中,除非您指定了其他输出文件。使用screen
或tmux
时,输出将留在虚拟会话的终端中,您可以随时重新连接会话来查看输出。
怎么重新连接screen会话
要重新连接到一个已经启动的screen
会话,您需要先列出所有的screen
会话,然后选择您想要重新连接的会话。
首先,打开一个终端窗口并输入以下命令来列出所有的screen
会话:
screen -ls
这个命令会提供一个或多个会话的列表,每个会话旁边都有一个唯一的标识符(通常是一串数字),如下所示:
There are screens on:
12345.pts-0.your_host (Detached)
67890.pts-1.your_host (Detached)
2 Sockets in /var/run/screen/S-your_username.
在上面的例子中,12345.pts-0.your_host
和67890.pts-1.your_host
是两个不同的会话标识符。如果您记得创建会话时指定的名字(比如rsync_session
),那么它也会显示在这个列表中。
要重新连接到会话,使用如下命令:
screen -r 12345
您需要用您自己的会话标识符替换12345
。如果您在创建screen
会话时给它命名了(例如使用了screen -S session_name
命令),您也可以使用该名称来重新连接:
screen -r session_name
如果您的screen
会话没有正常脱离(例如,如果您的SSH连接断开而导致的),则可能需要使用”-d -r”组合来先强制脱离会话,然后重新连接:
screen -d -r 12345
或者使用会话名称:
screen -d -r session_name
或者使用会话名称:
screen -d -r session_name
这样您就应该能够恢复到之前的screen
会话继续您的工作了。
怎么查看nohup后台运行中的任务
nohup
命令用于将程序以忽略挂断信号的方式运行起来,因此即使终端关闭,程序也会继续运行。如果你使用了 nohup
命令来运行 rsync
或其他任何命令,并且在命令的末尾添加了 &
符号来将其放入后台运行,那么程序将会继续执行,即使你断开了 SSH 连接。
要查看这些使用 nohup
运行的任务,你可以使用几种不同的方法:
1、查看nohup
输出文件:
默认情况下,nohup
命令会将输出写入到当前目录下的一个名为 nohup.out
的文件中,除非你指定了其他的输出文件。使用 tail
命令可以查看这个文件的内容:
tail -f nohup.out
这个命令会持续输出 nohup.out
文件的内容,你可以看到最新的日志信息。
2、使用ps
命令:
你可以使用 ps
命令来查看当前用户的所有后台运行的任务,包括使用 nohup
运行的任务:
ps -u $(whoami)
这会列出属于当前用户的所有进程。你可以查找 rsync
或其他你使用 nohup
运行的命令。
3、使用jobs
命令:
如果你的作业是在当前会话中放入后台的,那么使用 jobs
命令可以列出会话中所有的后台任务。请注意,jobs
命令只能显示当前会话中的后台任务,因此如果你已经关闭了终端或者创建了新的会话,这个命令不会显示任何输出。
4、使用pgrep
或pkill
命令:
你也可以使用 pgrep
来查找特定命令的进程ID,例如:
pgrep -a rsync
-a
选项会显示完整的命令行,这样你可以确认是你运行的 rsync
命令。
请记住,即使使用 nohup
,进程也是绑定在其启动的系统上的。如果系统重启,那些进程不会自动重新启动,除非它们被加入到了系统的启动脚本中,如 /etc/rc.local
或通过一个系统服务管理器如 systemd
来管理。