systemd завершает мои процессы до завершения ExecStop

try

for file in *"$foobar"*
do
   dest="$(echo $file| sed -e 's/\(.*\)\.[^\.]*$/\1.csv/' )"
   if test -f "$file" 
   then 
       /home/user/scriptModelise.pl  "$file" >> /home/user/Documents/collectCSV/$dest
   else
     echo "no $foobar file"
   fi
done

where

  • \(.*\)\.[^\.]*$ захват шаблона с любым символом, (конец шаблона) за которым следует точка, не точка до конца строки
  • \1.csv вставить шаблон найден, добавить .csv

  • *"$foobar "* расширится до литеры *foobar* (с соответствующим значением), если не будет найден подходящий файл. Отсюда необходимость test -f "$file"

Edit:

  • \(.*\)\.[^\.]*$ (левая сторона: поиск шаблона(ов))

split into ( _ are place holder )

  • __. *__________ шаблон с любым символом (точка имеет специальное значение: любой символ)

  • __.*__\._______ шаблон с любым символом, за которым следует точка (экранированная точка - обычная точка)

  • __.*__\.[^\. ]*$ шаблон с любым символом, (конец шаблона), за которым следует точка, не точка ([^\.]*) до конца строки (знак доллара специально предназначен для конца строки)

  • \(__\)__________ захват первой части шаблона.

  • \1.csv (правая сторона, что делать)

  • \1____ \1 сопоставьте то, что было в первом \( \), \2 для второго и так далее, используйте & для всего шаблона.

0
27.05.2015, 10:56
2 ответа

Решение найдено.

Я запустил hadoop и hbase, некоторые из их компонентов запускались по ssh-подключению к localhost, и процессы, которые запускались таким образом, не могли управляться systemd. Это был дизайн для распределенной системы, но в моем случае работа идет на одной машине. Поэтому я заменил в hadoop/bin/slaves.sh

for slave in `cat "$HOSTLIST"|sed  "s/#.*$//;/^$/d"`; do
 ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \
   2>&1 | sed "s/^/$slave: /" &
 if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then
   sleep $HADOOP_SLAVE_SLEEP
 fi
done

на

for slave in `cat "$HOSTLIST"|sed  "s/#.*$//;/^$/d"`; do
eval "$@"
 if [ "$HADOOP_SLAVE_SLEEP" != "" ]; then
   sleep $HADOOP_SLAVE_SLEEP
 fi
done

Проблема была решена, и теперь процессы отображаются в дереве служебных процессов.

Hbase, вероятно, имеет такое же решение, но теперь он запускается с distributed=false и не запускает никаких процессов по ssh.

0
29.04.2021, 00:28

У меня была такая же/похожая проблема. Я предполагаю, что вы выполняете su или sudo в сценарии «myService»? Это приводит к тому, что ваш сервисный процесс (es )запускается в user.slice, а не в system.slice.
По-видимому, в user.slice не должно быть запущено ничего «важного», а systemd просто убивает все (? )обрабатывает там при выключении/перезагрузке.
Я решил эту проблему, удалив все пользовательские переключатели (su/sudo )в моих стартовых сценариях и используя директиву User в юнит-файле (User=xxx ).

Проверьте, где (в каком слайсе )запущены ваши процессы с помощью systemd -cgls

0
29.04.2021, 00:28

Теги

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