Если вы можете разбить ваш основной скрипт на отдельные сервисы, вы можете легко решить это так:
В следующем примере у меня есть три службы возрождения, s1, s2 и s3, и я управляю ими всеми как группой через целевой s.target.
Примечание:
Если вы настроите три службы как Requires
в s.target, то, если одна из них выйдет из строя и возродится, все участвующие процессы в этой группе будут перезапущены.
Или, если вы настроите их как Wants
в вашем s.target, тогда, если один из них выйдет из строя и возродится, перезапустится только этот отдельный процесс.
Для каждой службы создайте файл службы s1, s2, s3:
/etc/systemd/system/s1.service:
[Unit]
Description=my worker s1
After=network.target
Before=foobar.service
PartOf=s.target
[Service]
Type=simple
ExecStart=/usr/local/bin/s1.sh
Restart=always
(обратите внимание, :если ваши службы идентичны, вы можете создать один файл s1@.service вместо нескольких файлов. Посмотрите в руководстве экземпляры службы, используя @ и %i.)
Теперь создайте файл основной целевой группы (), для которого требуется s1,службы s2 и s3:
/etc/systemd/system/s.target:
[Unit]
Description=main s service
Requires=s1.service s2.service s3.service
# or
# Wants=s1.service s2.service s3.service
[Install]
WantedBy=multi-user.target
Готово.
Как обычно, вы должны запустить systemctl daemon-reload
.
Теперь вы можете запускать свои службы с помощьюsystemctl start s.target
s1, s2 и s3 запускаются.
Вы можете остановить все три службы с помощьюsystemctl stop s.target
s1, s2 и s3 остановлены.
Естественно, вы можете запускать/останавливать/перезапускать/состоять отдельные службы как обычно:systemctl status s1
Если вы убьете процесс s1, s2 или s3, он автоматически перезапустится (Restart=always ).
Если вы использовали Requires
, то все процессы в группе будут перезапущены.
PS :Запустите systemctl enable s.target
, если хотите запускать службы при загрузке.
PS :К сожалению, при использовании systemctl вы не можете использовать сокращенное слово "s" для "s.target", как вы можете сделать с "s1" вместо полного ввода "s1.service". Вы должны ввести «s.target», когда хотите управлять группой.
Нет, это невозможно. Раздел, смонтированный только для чтения -, доступен только для чтения -, то есть вы не можете записать на него свой файл tar.gz.
Тем не менее, у вас есть доступ к сети на этом устройстве? Я думаю, вы должны иметь возможность синхронизировать их с отдельным компьютером и генерировать там tar.
Если вам действительно нужно сгенерировать tar-архив на встроенном компьютере, и он подключен к сети, вы можете попробовать использовать netcat:https://nakkaya.com/2009/04/15/using-netcat-for-file-transfers/
В tar вы должны добавить к команде флаг «O» или «--to -stdout». Передайте вывод этого в netcat.
На принимающей стороне запустить:
nc -l -p 1234 > out.file
На встроенном конце запустите:
tar cvO /partition | nc -w 3 [receiving IP] 1234
Обратите внимание, что netcat не шифруется, поэтому это рекомендуется только для -неконфиденциальной информации или в вашей локальной сети.
Другой возможностью является подключение удаленного диска с использованием, например, NFS или sshfs.
На встроенном компьютере:
sshfs user@remote.computer:/remote/computer/directory /mnt/remote
tar cvf /mnt/remote/files.tar /folder/to/tar
Если вы пытаетесь заархивировать корневой раздел, убедитесь, что удаленная папка пуста, чтобы в архиве не было кучи мусора.