rsync守护进程表现出色

时间:2016-12-08 14:36:39

标签: linux ubuntu daemon rsync

我正在运行一个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)

2 个答案:

答案 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 调用,为长时间运行的进程添加了另一个安全措施。