LINUX.ORG.RU
ФорумAdmin

Зависает скрипт на удалении симлинка

 ,


0

1

Приветствую! Моя программа вызывает скрипт nfs_client.sh

#!/bin/sh

rm /media/config/link1
rm /media/config/link2
rm /media/config/link3

ln -fs /media/bank1/config /media/config/link1
ln -fs /media/bank2/config /media/config/link2

................
................

# Apply settings
umount -a -t nfs
mount -a

Работаю в Debian 4.14.В целом всё исправно работает, но изредка возникает ситуация, когда ПО зависает на старте. Список процессов при этом:

 2197 root       0:04 /media/bank1/software/modules/my_prog -r 0
 2260 root       0:00 {nfs_client.sh} /bin/sh /media/bank1/service_settings/nfs_client.sh
 2261 root       0:00 {dns.sh} /bin/sh /media/bank2/service_settings/dns.sh
 2266 root       0:00 rm /media/config/link3

Т.е. висим на удалении link3, соответственно, ссылки не создаются и дальнейшая корректная работа ПО затруднена. Может, кто сталкивался с чем-то подобным?


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

Deleted ()

1. Debian 4.14 wut?
2. Что-то норкоманское
3. Нестабильная связь? Если да, то лучше забыть о nfs

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

rm по умолчанию работает в интерактивном режиме

Otherwise, if a file is unwritable, standard input is a terminal, and the -f or --force option is not given, or the -i or --interactive=always option is given, rm prompts the user
for whether to remove the file. If the response is not affirmative, the file is skipped.

По умолчанию - interactive в случае если стандартный ввод - терминал.

 ~ $ touch /tmp/foo
 ~ $ chmod 400 /tmp/foo
 ~ $ ls /tmp/foo
/tmp/foo
 ~ $ rm /tmp/foo
rm: remove write-protected regular empty file '/tmp/foo'? n
 ~ $ rm /tmp/foo < /dev/null
 ~ $ ls /tmp/foo
ls: cannot access '/tmp/foo': No such file or directory
Tanger ★★★★★ ()

Тут надо логи курить, dmesg и прочее. Что-то стало с ФС, на которой /media/config/. Если она сетевая, то пропала сеть, если локальная - нужен fsck.

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

Верно, если только ТС не пускает зачем-то скрипты из под screen.

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

Это алиас. Так же как и для cp.

Ээ. нет.

$ alias | grep rm
$ 

https://github.com/coreutils/coreutils/blob/master/src/rm.c

static void
rm_option_init (struct rm_options *x)
{
  x->ignore_missing_files = false;
  x->interactive = RMI_SOMETIMES;
  x->one_file_system = false;
  x->remove_empty_directories = false;
  x->recursive = false;
  x->root_dev_ino = NULL;
  x->stdin_tty = isatty (STDIN_FILENO);
  x->verbose = false;

  /* Since this program exits immediately after calling 'rm', rm need not
     expend unnecessary effort to preserve the initial working directory.  */
  x->require_restore_cwd = false;
}

Насколько я понял, поведение по умолчанию нельзя задать ключами. Изначально в x->interactive ставится RMI_SOMETIMES, а в переменную prompt_once - false.

Если указать опцию -I: в x->interactive, запишется RMI_SOMETIMES, но в переменную prompt_once - true. См. разницу в листинге ниже.

$ touch test1 test2 test3 test4
$ chmod 400 test*
$ rm ---presume-input-tty test* < /dev/null # this undocumented flag sets x->stdin_tty to 'true'
rm: remove write-protected regular empty file 'test1'? rm: remove write-protected regular empty file 'test2'? rm: remove write-protected regular empty file 'test3'? rm: remove write-protected regular empty file 'test4'?
$ ls test*
test1  test2  test3  test4
$ rm test*
rm: remove write-protected regular empty file 'test1'? n
rm: remove write-protected regular empty file 'test2'? n
rm: remove write-protected regular empty file 'test3'? n
rm: remove write-protected regular empty file 'test4'? n
$ rm -I test*
rm: remove 4 arguments? n
$ rm -i test* < /dev/null
rm: remove write-protected regular empty file 'test1'? rm: remove write-protected regular empty file 'test2'? rm: remove write-protected regular empty file 'test3'? rm: remove write-protected regular empty file 'test4'? 
$ rm test* < /dev/null
$ ls test*
ls: cannot access 'test*': No such file or directory

То есть по факту получается что для rm без параметров запущенной в терминале - работает как с -i, а с запущенной не в tty - как с -f. Но вообще как-то мутновато сделано. Часть описана в rm.c, часть в remove.c..

Tanger ★★★★★ ()
Последнее исправление: Tanger (всего исправлений: 1)
Ответ на: комментарий от Tanger

chmod 400 test*

Вы правы! А я дурак. Внимательнее надо было читать. Уж простите.

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