Передайте несколько команд для скапливания

Хорошо не точно формат Вы хотите, но как насчет

stat -c %y /etc/motd
=>
  2011-03-08 11:39:20.000000000 +0000

и затем используйте то, что Вы предпочитаете приносить той метке времени в форму.

Править
Я принимаю OpenSolaris или Солярис 11 где версия GNU stat связывается.

11
18.02.2018, 03:26
4 ответа

Вызовите оболочку явно.

flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

Обратите внимание, что любая переменная, которую Вы заменяете, локальна для того экземпляра оболочки. Например, COUNTER переменная не будет обновлена в сценарии выполнения вызова: необходимо будет считать его назад из файла (но это, возможно, изменилось тем временем), или как вывод команды:

new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')
7
27.01.2020, 19:58
  • 1
    , большое спасибо! Объяснение, которое Вы дали определенно, сохранило меня с другого часа головных болей –  d-_-b 29.12.2013, 22:17

Или вы можете запустить дескриптор файла

exec {counterfd}<~/counter.txt
flock -x -w 5 "$counterfd"
COUNTER=$(cat ~/counter.txt)
COUNTER=$(( COUNTER +1 ))
echo "$COUNTER" >~/counter.txt
exec {counterfd}<&-

Это также имеет то преимущество, что позволяет вам использовать переменную счетчика напрямую, в отличие от подходов, основанных на подшивках.

4
27.01.2020, 19:58

Инструмент flockнемного сложен в использовании, а справочная страница довольно короткая. Страница руководства предоставляет три способа использования инструмента:

  • flock [options] <file|directory> <command> [command args]
  • flock [options] <file|directory> -c <command>
  • flock [options] <file descriptor number>

При такой формулировке вопроса я определенно использовал бы третью форму flock. Если вы пойдете дальше на справочной странице для flock, вы найдете несколько примеров, которые показывают точный синтаксис для использования третьей формы:

#!/bin/bash
(
 flock -n 9 || exit 1
 echo "commands executed under lock..."
 echo "go here..."
) 9>/tmp/mylockfile

Я добавил #!/bin/bash.

Я успешно использовал эту форму flock.

3
27.01.2020, 19:58

У меня был интересный вариант использования. Мне приходилось запускать свой скрипт на Python как cronjob, используя flock, каждые 30 минут.И из-за некоторых вещей, связанных с корневым путем, внутри моего скрипта Python вместо

python /home/myfolder/script.py

Мне нужно было сделать

cd /home/myfolder/ && python script.py

Чтобы передать обе команды в crontab-

*/30 * * * * cd /home/myfolder/ /usr/bin/flock -w 0 /home/myfolder/my-file.lock && python my_script.py > /dev/null 2>&1

Мне помогло.

-1
31.08.2021, 10:48

Теги

Похожие вопросы