$ HOME
указывает на домашний каталог пользователя, в котором запущен сценарий. Службы systemd запускаются с правами root, поэтому он, скорее всего, попытается открыть /root/theFolder/run.sh
. Используйте абсолютные пути в служебных файлах.
У вас также есть параметр разветвления
. Это необходимо для программы, которая сама работает в фоновом режиме, ваш скрипт делает это? Большинство из них этого не делают, и если у вас нет, вам следует удалить эту опцию, иначе systemd будет ждать завершения вашего скрипта, чтобы заявить, что он запущен.
Также не рекомендуется использовать системные служебные файлы, указывающие на сценарии в вашем домашнем каталоге, и, возможно, это проблема безопасности. Поскольку они запускаются с правами root, любой, кто может их изменить, потенциально может получить root-доступ к вашему компьютеру.Гораздо лучше скопировать сценарий в / usr / local / bin
и убедиться, что он принадлежит и доступен для записи только пользователю root, чтобы предотвратить это. Также рекомендуется запустить сценарий от имени непривилегированного пользователя, используя параметры User =
и Group =
в служебном файле.
Если вы хотите запустить его от имени своего пользователя, лучше поместить служебный файл в ~ / .config / systemd / user /
и запустить / включить его с помощью systemctl --user enable yourservice && systemctl --user start yourservice
(обратите внимание, запускайте как ваш пользователь, а не root). См. и для получения дополнительной информации о пользовательских служебных файлах.
Если он только добавляется к (а не изменяется в середине), вы можете просто запустить tail -f
на нем. Он должен дождаться любых новых добавленных данных и распечатать их, и вы можете указать ему, с какой позиции начинать:
tail -c 0 -f datafile # start at the current file end
tail -c +123 -f datafile # start at byte 123
Чтобы фактически переместить данные куда-нибудь, должен работать конвейер до ssh
:
Итак если на удаленном конце уже есть первые 123456 байтов:
tail -c +123456 -f datafile | ssh user@somehost 'cat >> datafile.copy'
(Хотя, конечно, вам нужно проверить размер файла на удаленном компьютере перед запуском конвейера.)
Если вместо этого у вас есть изменения в середине файл, вам понадобится какой-то уровень ведения журнала в самой программе. Снимки файловой системы могут подойти, но интервал в одну секунду может быть слишком сложным, особенно если вам все равно придется сканировать файл на предмет изменений.
Rsync должен выдвигать дельты после начальной синхронизации. Другой вариант - сделать снимок расположения файла. Это будет зависеть от того, используете ли вы LVM или имеете ли файловую систему, поддерживающую моментальные снимки. Вы можете сделать снимок, а затем синхронизировать файл с удаленным расположением. Затем удалите снимок. Мне также нравится эта идея, потому что вы не трогаете живой файл.