LINUX.ORG.RU

Файл не стирается

 , , ,


0

2

Приветствую!

Я стартую скрипт из screen-сессии. В скрипте присутствует команда rm. Периодически возникает ошибка:

rm: remove write-protected regular empty file '/tmp/meteo_suspend'? y
Права и, соответсвенно, пользователь установлены user:user и rw-rw-r--.

Файл должен стираться, когда комп выходит из спящего режима.

Разъясните, пожалуйста, чё не так?

Ответ на: комментарий от ddidwyll

Если я параллельно из консоли стираю этот файл (даже без -f), то он стирается.

Вообще, непонятно, почему не стирается из screen-сессии.

Главное, что иногда стирается нормально и rm ошибки не выдает.

forest22
() автор топика

Права и, соответсвенно, пользователь установлены user:user и rw-rw-r--.

Права на что: на файл или на каталог?

Скрипт запускает какой юзер? Или он в автозапуске?

Kroz ★★★★★
()

Вангую, что файл пишет одна программ, а другая должна его прибить. ну и где то идет рассинхронизация действий и получается бардак.

Pro100User
()

Я после выхода из suspend создаю файл и меняю пользователя:

#!/bin/sh
if [ $1 = post ] && [ $2 = suspend ] ; then
  touch /tmp/meteo_suspend
  chown user:user /tmp/meteo_suspend
fi
1. Может быть, скрипт, который проверяет наличие этого файла ([ -f /tmp/meteo_suspend ]) и затем стирает его (rm /tmp/meteo_suspend) работает быстрее, чем выполняется команда chown?

2. Или, допустим, когда я из-под рута создаю файл, то группа не имеет прав на запись -rw-r--r--?

forest22
() автор топика

Чтобы удалить файл, должны быть права на запись в каталог, где этот файл находится.

akk ★★★★★
()
Ответ на: комментарий от forest22

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

пусть твой фейлющийся скрипт ведёт лог, в который добавляет результат работы и сведения о своих правах

anonymous
()
Ответ на: комментарий от forest22

Или, допустим, когда я из-под рута создаю файл, то группа не имеет прав на запись -rw-r--r--?

Во-первых, это надо было проверить до того, как сюда писать. Во-вторых, для вашего mode группа действительно не имеет права писать в этот файл, кроме владельца.

vodz ★★★★★
()
Ответ на: комментарий от vodz

Пользователь и группа одна и та же: user:user.

Я просто не знаю, для пользователя user имеет значение, если группа user не имеет прав на запись?

forest22
() автор топика

Дополнил скрипт строчкой:

ls -la /tmp/meteo_suspend >> /tmp/ls_la_meteo_suspend.log
Теперь:
...
if [ -f /tmp/meteo_suspend ] ; then
      ls -la /tmp/meteo_suspend >> /tmp/ls_la_meteo_suspend.log
      rm /tmp/meteo_suspend
...
Теперь посмотрю, какие права на файл, прежде, чем (пытаться) его стирать.

forest22
() автор топика
Ответ на: комментарий от forest22

дай угадаю, на /tmp стоит sticky bit

anonymous
()

Покажи вывод ls -lh /

XMs ★★★★★
()

Извините, перестартовал комп и иксы накрылись.. Пишет что-то про failed to set IOPL. Наверно, после апгрейда.

Надо разбираться.

forest22
() автор топика
Ответ на: комментарий от rumgot

нет, не пробовал; хочу разобраться.

Сейчас восстанавливаю иксы.

forest22
() автор топика

К сожалению, иксы не смог восстановить. Видно, сегодняшний апдейт что-то испортил.

По моему вопросу – перешел на параллельно инсталлированный Убунту 17.04 с такой же конфигурацией.

Пока все нормально. Но, как я писал, ошибка появляется нерегулярно, прибл. на 5-й - 10-й выход из суспенд.

forest22
() автор топика
Ответ на: комментарий от forest22

Чтобы не было race condition между touch и chown делай временное имя файла, меняй файлу владельца, а потом переименовывай файл.

imul ★★★★★
()
Ответ на: комментарий от imul

Спасибо, я дополнил скрипт изменением прав группы и переименовыванием файла.

forest22
() автор топика
Ответ на: комментарий от forest22

Вот и первая ошибка в скрипте. Кошерно-арийски, переменные должны стоять в кавычках.

(Возможно, вы это знаете и это, но всё же)

#!/bin/sh
if [ $1 = "post" ] && [ $2 = "suspend" ] ; then
  touch /tmp/meteo_suspend
  chown user:user /tmp/meteo_suspend
fi

Simple logical operators in Bash

blitz
()
Ответ на: комментарий от blitz

Да, вы правы. Тогда уж и переменные? Сейчас выглядит так:

#!/bin/sh
if [ "$1" = "post" ] && [ "$2" = "suspend" ] ; then
  touch /tmp/meteo_suspend0
  chown user:user /tmp/meteo_suspend0
  chmod 664 /tmp/meteo_suspend0
  mv /tmp/meteo_suspend0 /tmp/meteo_suspend
fi

forest22
() автор топика
Ответ на: комментарий от akk

На случай пустых $1 и $2.

Начиняется бред.

" — На случай пустых переменных

х — на случай если значение переменной начинается на - (минус/дефис)

futurama ★★★★★
()
Ответ на: комментарий от blitz

Вот и первая ошибка в скрипте. переменные должны стоять в кавычках.

Шта? Это у вас «post/suspend» то переменные?! Сидели бы молча, за умного бы сошли...

vodz ★★★★★
()
Ответ на: комментарий от akk

На случай пустых

пишут, если без bash-изма с [[ так:

if [ post = "$1" -a suspend = "$2" ]; then

vodz ★★★★★
()
Ответ на: комментарий от futurama

Начиняется бред.

То ни бред. Что за дурацкая мода всё бредом называть. Это классическое «слышал звон». В прочем, от вас тоже правильного кода не последовало...

vodz ★★★★★
()
Ответ на: комментарий от forest22

Merci за постановку точек над i.

My bad, именно кавычить не сами переменные, а $1/$2 - как они называются в терминологии bash scripting?

Этот мануал со stackoverflow, раскрывает суть многих подводных камней в проверке переменных, будь то цифровые или символьно-текстовые.

Эмпирическим путём, выбрал такое:

CLANG_LTO_CFLAGS="-flto=full"
CLANG_LTO_CXXFLAGS="${CLANG_LTO_CFLAGS}"
CLANG_LTO_LDFLAGS="-Wl,-plugin-opt=${OPT_LDFLAGS}"

  if [ "${LTO}" == true ]; then
    msg2 "Patching source LTO build..."
    if [ "${CLANG}" == true ]; then
      patch -p1 -i "${srcdir}/2020-mozilla-fallible.patch"
    else
      patch -p1 -i "${srcdir}/2010-gcc6-lto-partition-flag.diff"
    fi
  fi

  if [ "${PGO}" == true ]; then
    msg2 "Patching source PGO build..."
    patch -p1 -i "${srcdir}/2510-autoconf-linker-pie.patch"
    patch -p1 -i "${srcdir}/2520-gfx-shape-word.patch"
  fi

Но это zsh и портабельно, по идее и на bash.

blitz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.