LINUX.ORG.RU
решено ФорумAdmin

завернуть дочерний процесс в systemd

 ,


0

1

написал я скрипт, из которого я запускаю программку в бэкграунд.

типа вот:

test.sh

#!/bin/bash


monitor() {
    inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read TARGETFILE
    do
        [ "$(stat --format=%a $TARGETFILE)" -ne 660 ] && chmod 00660 $TARGETFILE
    done
}


monitor &

Если в systemd service file запихнуть test.sh, то она видит,что скрипт отработал и до свидания, сервис типа неактивен. Бэкгруанд пашет,( те команда inotifywait -m -r -e attrib --format «%w%f» --fromfile /etc/default/inotifywait весит в процессах и работает) но я не могу работать с этим всем как с сервисом. Я бы хотел дописать сприпту возможность reload/restart etc.

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

P.S. Передаю горячий привет мейтейнерам самбы, которые выпилили force security mode в угоду ACL

★★★★

Последнее исправление: constin (всего исправлений: 4)

Во-первых, попробуй хотя бы один раз перечитывать своё сообщение перед отправкой. Из-за количества опечаток читать противно.

Во-вторых, попробуй читать документацию по systemd, прежде чем что-то куда-то «запихивать». Как минимум man Type=forking. А как максимум, зачем ты отправляешь функцию в фон? Тебе не нужно демонизироваться, systemd сам всё за тебя сделает.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)

т.е. ты запускаешь inotifywait без демонических свойств и потом парсишь его вывод.
и это делаешь циклично ??

написать скрипт inotifywait.cervice с Type=oneshot в Exec засунуть однократный запуск твоей команды. отладить правильную работу. без отправки процесса в фон.

написать inotifywait.timer, в котором прописать запуск inotifywait.service каждые нн секунд/минут.

как-то так если я правильно понял.

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

Вы очень быстро ответили, я как раз занимался правкой опечаток)

но на самом деле, зачем ты отправляешь функцию в фон? systemd сам всё за тебя сделает.

Спасибо, мог бы и сам догадаться.

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

т.е. ты запускаешь inotifywait без демонических свойств и потом парсишь его вывод.

да

и этот скрипт циклично запускаешь ??

нет, этот скрипт (без системд) можно запустить один раз, при этом функция с inotifywait будет висеть в бэкграунде и отрабатывать события.

написать скрипт inotifywait.cervice с Type=oneshot в Exec засунуть однократный запуск твоей команды. отладить правильную работу.

Вот мне не нужен oneshot. Если я добавляю шару, то я хочу зарелоадить этот процесс, чтобы он прочитал новые настройки. Сделать это я хочу через systemd.

constin ★★★★
() автор топика

Кстати,

P.S. Передаю горячий привет мейтейнерам самбы, которые выпилили force security mode в угоду ACL

а в чём проблема, собственно, заюзать default ACLs?

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

а в чём проблема, собственно, заюзать default ACLs?

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

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

раз перечитывать своё сообщение перед отправкой

Проверял, у меня не работает. Ошибки замечаются только про чтении после отправки.

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

Тебе не нужно демонизироваться, systemd сам всё за тебя сделает.

что-то нет.

Убрал демонизацию monitor & >>> monitor.

 cat /etc/systemd/system/inotify.service 
[Unit]
Description=inotify.service
Wants=
Before=
[Service]
ExecStart=/opt/inotify/monitor.sh
Type=
[Install]
WantedBy=multi-user.target

systemctl start inotify.service

cat /var/log/syslog

...

Sep  7 09:51:32 fileserver2 systemd[1]: Started inotify.service.
Sep  7 09:51:32 fileserver2 inotifywait[22965]: Setting up watches.  Beware: since -r was given, this may take a while!


Вроде ок? но нет

root@fileserver2:/opt/inotify# cat /var/log/syslog
Sep  7 09:51:32 fileserver2 systemd[1]: Started inotify.service.
Sep  7 09:51:32 fileserver2 inotifywait[22965]: Setting up watches.  Beware: since -r was given, this may take a while!

root@fileserver2:/opt/inotify# ps aux | grep  inoti
root     23087  0.0  0.0  14292   964 pts/0    S+   09:53   0:00 grep inoti

root@fileserver2:/opt/inotify# ps aux | grep monit
root     23091  0.0  0.0  14292   940 pts/0    S+   09:53   0:00 grep monit

root@fileserver2:/opt/inotify# ps aux | grep 22965
root     23182  0.0  0.0  14292   972 pts/0    S+   09:53   0:00 grep 22965
constin ★★★★
() автор топика
Ответ на: комментарий от constin

Вот зачем тебе systemd нужен? Чтобы грепать текстовые логи и вывод ps? Делай systemctl status inotify.service и journalctl -e -u inotify.service.

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

Вот зачем тебе systemd нужен?

Смотри, скрипт читает при запуске /etc/default/inotifywait. Там список директорий, которые он должен мониторить. При изменении этого списка мне надо перезапустить скрипт. Можно сделать колхоз, но если уж эти «хорошие» ребята перевели все на системд, то по правильному мне надо сделать сервис и научить его reload. Но чтобы приступить к написаниб reload, мне бы для начала просто заставить его запускаться как сервис.

А он отрабатывает и закрывается. Потому что запускается дочерний процесс.


root@fileserver2:/opt/inotify# systemctl status inotify.service
● inotify.service
   Loaded: loaded (/etc/systemd/system/inotify.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Fri 2018-09-07 09:51:32 CEST; 33min ago
  Process: 22961 ExecStart=/opt/inotify/monitor.sh (code=exited, status=0/SUCCESS)
 Main PID: 22961 (code=exited, status=0/SUCCESS)
      CPU: 4ms

Sep 07 09:51:32 fileserver2 systemd[1]: Started inotify.service.
Sep 07 09:51:32 fileserver2 inotifywait[22965]: Setting up watches.  Beware: since -r was given, this may take a while!


root@fileserver2:/opt/inotify# 


root@fileserver2:/opt/inotify# journalctl -e -u inotify.service

Sep 07 09:51:32 fileserver2 systemd[1]: Started inotify.service.
Sep 07 09:51:32 fileserver2 inotifywait[22965]: Setting up watches.  Beware: since -r was given, this may take a while!
constin ★★★★
() автор топика
Последнее исправление: constin (всего исправлений: 2)
Ответ на: комментарий от constin

Дочерний процесс сам по себе не может привести к тому, что сервис останавливается. Только в том случае, если предок завершается.

И у тебя очень странный лог. Где строчка «Watches established»? Такое ощущение, что ты на самом деле не сделал то, что я тебе сказал первым сообщением.

Проверил у себя — всё работает:

# cat /opt/inotify/monitor.sh
#!/bin/bash


monitor() {
    inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read TARGETFILE
    do
        [ "$(stat --format=%a $TARGETFILE)" -ne 660 ] && chmod 00660 $TARGETFILE
    done
}


monitor

# systemctl cat inotify.service
# /etc/systemd/system/inotify.service
[Unit]
Description=inotify.service
Wants=
Before=
[Service]
ExecStart=/opt/inotify/monitor.sh
Type=
[Install]
WantedBy=multi-user.target

# systemctl status inotify.service
● inotify.service
   Loaded: loaded (/etc/systemd/system/inotify.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2018-09-07 11:54:34 MSK; 1min 30s ago
 Main PID: 11005 (monitor.sh)
       IP: 0B in, 0B out
    Tasks: 3 (limit: 4915)
   Memory: 1.7M
      CPU: 9ms
   CGroup: /system.slice/inotify.service
           ├─11005 /bin/bash /opt/inotify/monitor.sh
           ├─11014 inotifywait -m -r -e attrib --format %w%f --fromfile /etc/default/inotifywait
           └─11015 /bin/bash /opt/inotify/monitor.sh

сен 07 11:54:34 intelfx-laptop systemd[1]: Started inotify.service.
сен 07 11:54:34 intelfx-laptop monitor.sh[11005]: Setting up watches.  Beware: since -r was given, this may take a while!
сен 07 11:54:34 intelfx-laptop monitor.sh[11005]: Watches established.

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

А тебе нужно не Type=forking делать, а амперсанд из скрипта убрать! Зачем тебе лишний форк, если systemd его за тебя делает?

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

вот еще раз без Type=forking и амперсанда, не пашет

root@fileserver2:/opt/inotify# cat /opt/inotify/monitor.sh
#!/bin/bash

monitor() {
    inotifywait -m -r -d -o /var/log/syslog -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read TARGETFILE
    do
	[ "$(stat --format=%a $TARGETFILE)" -ne 660 ] && chmod 00660 $TARGETFILE
    done                                                                              
}                                                                                     
                                                                                      
monitor 

root@fileserver2:/opt/inotify# cat  /etc/systemd/system/inotify.service 
[Unit]
Description=inotify.service
Wants=
Before=
[Service]
ExecStart=/opt/inotify/monitor.sh
Type=
[Install]
WantedBy=multi-user.target
root@fileserver2:/opt/inotify# systemctl start inotify.service
root@fileserver2:/opt/inotify# systemctl status inotify.service
● inotify.service
   Loaded: loaded (/etc/systemd/system/inotify.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Fri 2018-09-07 11:03:43 CEST; 1s ago
  Process: 1244 ExecStart=/opt/inotify/monitor.sh (code=exited, status=0/SUCCESS)
 Main PID: 1244 (code=exited, status=0/SUCCESS)
      CPU: 5ms

Sep 07 11:03:43 fileserver2 systemd[1]: Started inotify.service.
Sep 07 11:03:43 fileserver2 inotifywait[1256]: Setting up watches.  Beware: since -r was given, this may take a while!



c Type=forking пашет
constin ★★★★
() автор топика
Ответ на: комментарий от intelfx

ах ты ж блин , стоит -d -o /var/log/syslog

этого не должно быть, это демон мод

минутку, я все перевроверю

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

все пашет, спасибо



root@fileserver2:/opt/inotify# systemctl status inotify.service
● inotify.service
   Loaded: loaded (/etc/systemd/system/inotify.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-09-07 11:55:30 CEST; 7s ago
 Main PID: 9679 (monitor.sh)
    Tasks: 3 (limit: 4915)
   Memory: 1.7M
      CPU: 197ms
   CGroup: /system.slice/inotify.service
           ├─9679 /bin/bash /opt/inotify/monitor.sh
           ├─9680 inotifywait -m -r -e attrib --format %w%f --fromfile /etc/default/inotifywait
           └─9681 /bin/bash /opt/inotify/monitor.sh

Sep 07 11:55:30 fileserver2 systemd[1]: Started inotify.service.
Sep 07 11:55:30 fileserver2 monitor.sh[9679]: Setting up watches.  Beware: since -r was given, this may take a while!
Sep 07 11:55:30 fileserver2 monitor.sh[9679]: Watches established.
constin ★★★★
() автор топика
Последнее исправление: constin (всего исправлений: 1)
Ответ на: комментарий от anonymous

1. маки ( да можно им маунтить nfs, но мне лень их удаленно админить, так как все остальные десктопы это pxe клиенты и соответственно точка сборки в одном месте) Кстати, apple использует теперь самбу по умолчанию.

2. я еще не разбирался с nfs4 и ее авторизацией через керберос,а давать доступ сетям безответственно.

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

Понял, спасибо.

я еще не разбирался с nfs4 и ее авторизацией через керберос,а давать доступ сетям безответственно

Может быть это и к лучшему.

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

Окончательная версия



#!/bin/bash


monitor() {
    inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read TARGETFILE
    do
        TARGETFILE="${TARGETFILE//\ /\\\ }"
        #echo $TARGETFILE  #for debug
        if [[ -f $TARGETFILE ]]; then
                [ "$(stat --format=%a $TARGETFILE)" -ne 660 ] && chmod 00660 $TARGETFILE
        elif [[ -d $TARGETFILE ]]; then
            #[ "$(stat --format=%a $TARGETFILE)" -ne 770 ] && chmod 00770 $TARGETFILE
            echo "$(date) ${TARGETFILE} is folder" >> /var/log/monitor.log
        else
            echo "$(date) Something goes wrong with variable:  ${TARGETFILE}" >> /var/log/monitor.log
        fi

    done
}

monitor

constin ★★★★
() автор топика
Последнее исправление: constin (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.