我正在运行一个rsync守护程序(为SaneSecurity签名提供镜像)。
rsync就像这样启动(来自runit):
/usr/bin/rsync -v --daemon --no-detach
配置包含:
use chroot = no
munge symlinks = no
max connections = 200
timeout = 30
syslog facility = local5
transfer logging = no
log file = /var/log/rsync.log
reverse lookup = no
[sanesecurity]
comment = SaneSecurity ClamAV Mirror
path = /srv/mirror/sanesecurity
read only = yes
list = no
uid = nobody
gid = nogroup
但我所看到的是很多“挥之不去”的rsync进程:
# ps auxwww|grep rsync
root 423 0.0 0.0 4244 1140 ? Ss Oct30 0:00 runsv rsync
root 2529 0.0 0.0 11156 2196 ? S 15:00 0:00 /usr/bin/rsync -v --daemon --no-detach
nobody 4788 0.0 0.0 20536 2860 ? S 15:10 0:00 /usr/bin/rsync -v --daemon --no-detach
nobody 5094 0.0 0.0 19604 2448 ? S 15:13 0:00 /usr/bin/rsync -v --daemon --no-detach
root 5304 0.0 0.0 11156 180 ? S 15:15 0:00 /usr/bin/rsync -v --daemon --no-detach
root 5435 0.0 0.0 11156 180 ? S 15:16 0:00 /usr/bin/rsync -v --daemon --no-detach
root 5797 0.0 0.0 11156 180 ? S 15:19 0:00 /usr/bin/rsync -v --daemon --no-detach
nobody 5913 0.0 0.0 20536 2860 ? S 15:20 0:00 /usr/bin/rsync -v --daemon --no-detach
nobody 6032 0.0 0.0 20536 2860 ? S 15:21 0:00 /usr/bin/rsync -v --daemon --no-detach
root 6207 0.0 0.0 11156 180 ? S 15:22 0:00 /usr/bin/rsync -v --daemon --no-detach
nobody 6292 0.0 0.0 20544 2744 ? S 15:23 0:00 /usr/bin/rsync -v --daemon --no-detach
root 6467 0.0 0.0 11156 180 ? S 15:25 0:00 /usr/bin/rsync -v --daemon --no-detach
root 6905 0.0 0.0 11156 180 ? S 15:29 0:00 /usr/bin/rsync -v --daemon --no-detach
(现在是15:30)
所以有进程(甚至没有删除权限!)自15:10,15:13之后徘徊等等。
他们在做什么?
我们来看看:
# strace -p 5304
strace: Process 5304 attached
select(4, [3], NULL, [3], {25, 19185}^C
strace: Process 5304 detached
<detached ...>
# strace -p 5797
strace: Process 5797 attached
select(4, [3], NULL, [3], {48, 634487}^C
strace: Process 5797 detached
<detached ...>
这与来自Ubuntu Xenial的rsync以及从PPA安装(目前使用rsync 3.1.2-1~ubuntu16.04.1york0)
答案 0 :(得分:1)
为每个连接创建一个进程。在客户选择模块之前,进程不知道它是否应该删除权限。
您可以轻松创建此类流程。
nc $host 873
您会注意到30秒后连接不会关闭,因为超时只是磁盘I / O超时。 rsync客户端有--contimeout
选项,但似乎缺少服务器端选项。
答案 1 :(得分:1)
最后,我尝试从(x)inetd调用rsync而不是独立运行它。
class SomeDatabaseClass
{
const ENCODED_FIELDS = [
'field1'
];
private $dbConnection;
private $encoder;
private $decoder;
public function __construct(\PDO $dbConnection, Encoder $encoder, Decoder $decoder)
{
$this->dbConnection = $dbConnection;
$this->encoder = $encoder;
$this->decoder = $decoder;
}
public function getData()
{
$stmt = $this->dbConnection->query('SELECT field1, field2 FROM the_fields');
return $this->decodeFields($stmt->fetchAll());
}
public function saveData($fields)
{
$fields = $this->encodeFields($fields);
// store data in db
}
private function decodeFields($fields)
{
foreach ($fields as $name => $value) {
if (!in_array($name, self::ENCODED_FIELDS, true)) {
continue;
}
$fields[$name] = $this->decoder->decode($value);
}
return $fields;
}
private function encodeFields($fields)
{
foreach ($fields as $name => $value) {
if (!in_array($name, self::ENCODED_FIELDS, true)) {
continue;
}
$fields[$name] = $this->encoder->encode($value);
}
return $fields;
}
}
另外一点,我用超时包装 rsync 调用,为长时间运行的进程添加了另一个安全措施。