все команды группы должны быть успешными или нет - PullRequest
0 голосов
/ 28 сентября 2019

Я тестирую следующий сценарий: Либо обе команды должны быть успешными, либо ни одной.

Пример. Предположим, что есть файл abc, но нет файла xyz.И есть команды:

mv abc bcd   # abc exists and gets renamed to bcd. But I want this to fail
             # as well since command below is going to fail.

mv xyz yza   # xyz doesn't exist, so this will fail.

Как добиться этого вида атомарности в bash?

Ответы [ 2 ]

1 голос
/ 28 сентября 2019

Проверка наличия файла xyz не поможет: вы можете упустить права на запись в yza. Сначала скопируйте оба файла и удалите оригиналы, если обе сработавшие копии тоже могут выйти из строя.Другая программа могла ожидать bcd и начать некоторую обработку перед откатом.Вы можете попробовать что-то с каталогом tmp:

rollback() {
   mv ${tmpdir}/bcd abc
   mv ${tmpdir}/yza xyz
   rm -r ${tmpdir}
   echo "action failed"
   exit
}

tmpdir=/tmp/movetwo
mkdir ${tmpdir} || exit

cp abc ${tmpdir}/bcd || rollback 
cp xyz ${tmpdir}/yza || rollback
rm abc ${tmpdir}/bcd || rollback 
rm xyz ${tmpdir}/yza || rollback
cp ${tmpdir}/bcd bcd || rollback 
cp ${tmpdir}/yza yza || rollback
rm -r ${tmpdir}

Это может все же пойти не так по-разному (после удаления abc, какой-то другой процесс заполняет свободное место на диске, разрешения изменены, ...)

Вы можете попробовать что-то подобное с

# check bcd and yza not exist, code can not handle that
test -f bcd && { echo "nope"; exit 1; }
test -f yza && { echo "nope"; exit 1; }

# optional other tests: you can delete abc xyz, other tests...
ln abc bcd && ln xyz yza && rm abc xyz

#cleanup when moving abc failed
test -f abc && { mv yza xyz; rm bcd; }

#cleanup when moving xyz failed
test -f xyz && { mv bcd abc; rm yza; }
1 голос
/ 28 сентября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...