2015-09-02 1 views
3

Я работаю над Debian Jessie. Как пользователь opuser я создал файл, и я его владельцем:Не удается записать в файл, который у меня есть, и отмечен как записываемый?

[email protected]: $ ls -lash /webapps/myapp/run/gunicorn.sock 
0 srwxrwxrwx 1 opuser webapps 0 Sep 1 18:50 /webapps/myapp/run/gunicorn.sock 

Теперь, если я пытаюсь открыть файл для записи в него:

[email protected]: $ vi /webapps/myapp/run/gunicorn.sock 

vi показывает ошибку в нижней части: "~/run/gunicorn.sock" [Permission Denied].

Почему я не могу открыть файл, чтобы написать его, когда я его владею, а разрешения на файл показывают, что он доступен для записи в мире?

ОБНОВЛЕНО:

Файл был создан путем запуска gunicorn, и причина, я отладки в том, что пользователь gunicorn не может написать к нему либо:

gunicorn openprescribing.wsgi:application --name myapp_prod --workers 3 --bind=unix:/webapps/webapps/run/gunicorn.sock --user opuser --group webapps --log-level=debug 

Вот полная ошибка :

[2015-09-01 11:18:36 +0000] [9439] [DEBUG] Current configuration: 
    proxy_protocol: False 
    worker_connections: 1000 
    statsd_host: None 
    max_requests_jitter: 0 
    post_fork: <function post_fork at 0x7efebefd2230> 
    pythonpath: None 
    enable_stdio_inheritance: False 
    worker_class: sync 
    ssl_version: 3 
    suppress_ragged_eofs: True 
    syslog: False 
    syslog_facility: user 
    when_ready: <function when_ready at 0x7efebefc6ed8> 
    pre_fork: <function pre_fork at 0x7efebefd20c8> 
    cert_reqs: 0 
    preload_app: False 
    keepalive: 2 
    accesslog: None 
    group: 999 
    graceful_timeout: 30 
    do_handshake_on_connect: False 
    spew: False 
    workers: 3 
    proc_name: myapp_prod 
    sendfile: True 
    pidfile: None 
    umask: 0 
    on_reload: <function on_reload at 0x7efebefc6d70> 
    pre_exec: <function pre_exec at 0x7efebefd27d0> 
    worker_tmp_dir: None 
    post_worker_init: <function post_worker_init at 0x7efebefd2398> 
    limit_request_fields: 100 
    on_exit: <function on_exit at 0x7efebefd2e60> 
    config: None 
    secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'} 
    proxy_allow_ips: ['127.0.0.1'] 
    pre_request: <function pre_request at 0x7efebefd2938> 
    post_request: <function post_request at 0x7efebefd2a28> 
    user: 999 
    forwarded_allow_ips: ['127.0.0.1'] 
    worker_int: <function worker_int at 0x7efebefd2500> 
    threads: 1 
    max_requests: 0 
    limit_request_line: 4094 
    access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s" 
    certfile: None 
    worker_exit: <function worker_exit at 0x7efebefd2b90> 
    chdir: /webapps/myapp/myapp 
    paste: None 
    default_proc_name: myapp.wsgi:application 
    errorlog: - 
    loglevel: debug 
    logconfig: None 
    syslog_addr: udp://localhost:514 
    syslog_prefix: None 
    daemon: False 
    ciphers: TLSv1 
    on_starting: <function on_starting at 0x7efebefc6c08> 
    worker_abort: <function worker_abort at 0x7efebefd2668> 
    bind: ['unix:/webapps/myapp/run/gunicorn.sock'] 
    raw_env: [] 
    reload: False 
    check_config: False 
    limit_request_field_size: 8190 
    nworkers_changed: <function nworkers_changed at 0x7efebefd2cf8> 
    timeout: 30 
    ca_certs: None 
    django_settings: None 
    tmp_upload_dir: None 
    keyfile: None 
    backlog: 2048 
    logger_class: gunicorn.glogging.Logger 
    statsd_prefix: 
[2015-09-01 11:18:36 +0000] [9439] [INFO] Starting gunicorn 19.3.0 
Traceback (most recent call last): 
    File "/home/anna/.virtualenvs/myapp/bin/gunicorn", line 11, in <module> 
    sys.exit(run()) 
    File "/home/anna/.virtualenvs/myapp/local/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 74, in run 
    WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run() 
    File "/home/anna/.virtualenvs/myapp/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 189, in run 
    super(Application, self).run() 
    File "/home/anna/.virtualenvs/myapp/local/lib/python2.7/site-packages/gunicorn/app/base.py", line 72, in run 
    Arbiter(self).run() 
    File "/home/anna/.virtualenvs/myapp/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 171, in run 
    self.start() 
    File "/home/anna/.virtualenvs/myapp/local/lib/python2.7/site-packages/gunicorn/arbiter.py", line 130, in start 
    self.LISTENERS = create_sockets(self.cfg, self.log) 
    File "/home/anna/.virtualenvs/myapp/local/lib/python2.7/site-packages/gunicorn/sock.py", line 211, in create_sockets 
    sock = sock_type(addr, conf, log) 
    File "/home/anna/.virtualenvs/myapp/local/lib/python2.7/site-packages/gunicorn/sock.py", line 104, in __init__ 
    os.remove(addr) 
OSError: [Errno 13] Permission denied: '/webapps/myapp/run/gunicorn.sock' 
+0

Вы понимаете, что у вас есть два разных пути? – arkascha

+0

извините, это просто опечатка! изм. – Richard

+0

И домашний каталог пользователей на самом деле '/ webapps/myapp'? – arkascha

ответ

3

Узел, который вы пытаетесь открыть, является сокетом. Более preciselly сокет домена unix (s в флажках разрешений сигнализирует об этом). Сокеты не являются open(2) обычным способом (по этой причине vi(1) не удается.) Их необходимо приобрести с помощью системного вызова socket(PF_UNIX, ...) (см. unix(7)), а затем bind(2) ed на правильный путь в файловой системе (это то, что заставляет их появляться в иерархия файловой системы).

После того, как у вас есть сокет такого типа, вы должны установить connect(2) его в другой сокет (или до accept(2), так как он привязан к узлу файловой системы), чтобы обеспечить передачу потока от одного сокета к другому.

Для ознакомления с сокетами api programming (и сокетами UNIX) читайте знаменитую книгу R.W.Stevens Unix Network Programming, том 1: Сетевой интерфейс Sockets (3-е издание).

1

Тип файла - это сокет. Он читается один раз/записывается один раз. Не уверен, что вы можете открыть это с помощью обычного текстового редактора.

+0

Спасибо, это объясняет, почему я не могу открыть его в vi. Причина, по которой я пытаюсь, заключается в том, что пользователь-стрелок не может писать на него - см. Обновленный вопрос. Любая идея, как я могу отлаживать то, что происходит с помощью пушки? – Richard