关闭,但不完全是。
独立于任何终端
ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'
您需要关闭所有连接到ssh套接字的文件描述符,因为只要某个远程进程打开了套接字,ssh会话就不会关闭。如果您对脚本的输出不感兴趣(大概是因为脚本本身负责写日志文件),请将其重定向到/dev/null
(但是请注意,这将隐藏诸如无法启动脚本的错误)。
使用nohup
这里没有有用的作用。nohup
安排程序运行,如果程序的控制终端消失了,它不会接收到HUP信号,但是这里首先没有终端,因此没有任何事情可以将SIGHUP突然发送给进程。而且,仅nohup
将标准输出和标准错误(但不是标准输入)重定向到文件,但前提是它们连接到终端,而事实并非如此。
从终端上拆卸
aaron@localpc$ ssh root@remoteserver
root@remoteserver# nohup /root/backup.sh </dev/null &
nohup: appending output to `nohup.out'
[1] 12345
root@remoteserver# exit
aaron@localpc$
使用nohup
从它的控制终端分离的脚本,以便它不会收到SIGHUP当终端消失。nohup
如果脚本nohup.out
连接到终端,还将脚本的标准输出和标准错误重定向到一个名为的文件;您必须自己照顾标准输入。
保留远程终端
如果要使该命令在远程终端上运行但不将其附加到SSH会话,请在终端多路复用器(例如Screen或Tmux)中运行它。
ssh root@remoteserver 'screen -S backup -d -m /root/backup.sh'
您稍后可以通过screen -S backup -rd
以root用户身份在该计算机上调用来重新连接到运行脚本的终端。
自动执行一个远程命令
为了获得更好的安全性,请不要过于广泛地打开直接远程root用户登录名。创建一个专用密钥对,并在中给它一个强制命令/root/.ssh/authorized_keys
。公钥文件的内容是AAAA…== wibble@example.com
;添加逗号分隔的选项列表,其中包括command="…"
指定该键只能用于执行此特定命令的选项。确保将选项和键全部放在一行上。
command="/root/backup.sh </dev/null >/dev/null 2>/dev/null &",no-port-forwarding,no-agent-forwarding,no-x11-forwarding,no-pty,no-user-rc AAAA…== wibble@example.com