저는 Systemd 서비스를 작성 중입니다(지시된 대로 작성됨:종료 직전에 systemd로 스크립트를 실행하는 방법은 무엇입니까?) 재부팅하거나 종료할 때마다 일부 파일을 동기화, 암호화 및 푸시합니다. 스크립트를 수동으로 실행하면 완벽하게 작동하지만 Systemd에서 스크립트를 실행하도록 허용하면 몇 가지 문제가 있습니다.
- 스크립트가 순서 없이 실행되는 것 같습니다(
git add
마지막에 가까워야 할 때 먼저 표시됨). - 위 문제와 관련하여 스크립트는 무시
--git-dir
하고 전체 파일 시스템을 git 저장소에 추가하려고 시도하는 것 같습니다.
sync.service
[Unit]
Description=Sync, encrypt, and push important files
[Service]
Type=oneshot
User=shane
RemainAfterExit=true
ExecStop=/home/shane/bin/sync.py
[Install]
WantedBy=multi-user.target
sync.py
#!/usr/bin/python
import os
import shutil
import subprocess
import datetime
def sync_config():
source_root = '/home/shane'
destination_root = '/home/shane/sync/public/config'
files = [
'.config/awesome',
'.config/cmus/playlists',
'.config/cmus/autosave',
'.config/cmus/shane.theme',
'.vim/autoload',
'.vim/colors',
'bin',
'.bashrc',
'.vimrc',
]
print('Syncing configuration files')
# clear out old config
for file in os.listdir(destination_root):
path = os.path.join(destination_root, file)
if os.path.isfile(path):
os.unlink(path)
elif os.path.isdir(path):
shutil.rmtree(path)
print(' removed ' + path)
# copy files to config
for file in files:
source = os.path.join(source_root, file)
destination = os.path.join(destination_root, file)
if os.path.isfile(source):
shutil.copy(source, destination)
else:
shutil.copytree(source, destination)
print(' copied ' + source + ' to ' + destination)
def encrypt_private():
root = '/home/shane/sync'
private = 'private'
passfile = '/home/shane/sync/private/gpgpassphrase'
tar = os.path.join(root, private) + '.tar.gz'
gpg = tar + '.gpg'
print('Encrypting private folder')
print(' removing old')
if os.path.isfile(gpg):
os.remove(gpg)
print(' compressing')
subprocess.run(['tar', '-czf', tar, '-C', root, private])
print(' encrypting')
subprocess.run(['gpg2', '--batch', '--passphrase-file', passfile, '-c', tar])
os.remove(tar)
def push_sync():
git = '/home/shane/sync/.git'
time = 'synced ' + str(datetime.datetime.now())
print('Pushing synced files')
subprocess.run(['git', '--git-dir=' + git, 'add', '-A'])
subprocess.run(['git', '--git-dir=' + git, 'commit', '-m', time])
subprocess.run(['git', '--git-dir=' + git, 'push', 'bitbucket', 'master'])
sync_config()
encrypt_private()
push_sync()
# journalctl -u sync
-- Logs begin at Thu 2019-06-27 00:13:11 MST, end at Sun 2019-06-30 22:10:03 MST. --
Jun 30 22:05:03 arch systemd[1]: Started Sync, encrypt, and push important files.
Jun 30 22:05:06 arch systemd[1]: Stopping Sync, encrypt, and push important files...
Jun 30 22:05:07 arch sync.py[16940]: warning: could not open directory 'proc/tty/driver/': Permission denied
Jun 30 22:05:07 arch sync.py[16940]: warning: could not open directory 'proc/1/task/1/fd/': Permission denied
Jun 30 22:05:07 arch sync.py[16940]: warning: could not open directory 'proc/1/task/1/fdinfo/': Permission denied
...
Jun 30 22:05:13 arch sync.py[16940]: error: open("boot/grub/grub.cfg"): Permission denied
Jun 30 22:05:13 arch sync.py[16940]: error: unable to index file 'boot/grub/grub.cfg'
Jun 30 22:05:13 arch sync.py[16940]: fatal: adding files failed
Jun 30 22:05:13 arch sync.py[16940]: warning: could not open directory 'root/': Permission denied
Jun 30 22:05:13 arch sync.py[16940]: warning: could not open directory 'lost+found/': Permission denied
Jun 30 22:05:13 arch sync.py[16940]: On branch master
Jun 30 22:05:13 arch sync.py[16940]: Changes not staged for commit:
Jun 30 22:05:13 arch sync.py[16940]: deleted: .gitignore
Jun 30 22:05:13 arch sync.py[16940]: deleted: private.tar.gz.gpg
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.bashrc
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.config/awesome/rc.lua
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.config/awesome/themes/shane/theme.lua
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.config/awesome/themes/shane/wallpaper.jpg
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.config/cmus/autosave
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.config/cmus/playlists/all
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.config/cmus/playlists/top
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.config/cmus/shane.theme
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.vim/autoload/plug.vim
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.vim/autoload/plug.vim.old
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.vim/colors/molokai.vim
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/.vimrc
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/bin/sync.py
Jun 30 22:05:13 arch sync.py[16940]: deleted: public/config/bin/sync.service
Jun 30 22:05:13 arch sync.py[16940]: Untracked files:
Jun 30 22:05:13 arch sync.py[16940]: bin
Jun 30 22:05:13 arch sync.py[16940]: boot/
Jun 30 22:05:13 arch sync.py[16940]: dev/
Jun 30 22:05:13 arch sync.py[16940]: etc/
Jun 30 22:05:13 arch sync.py[16940]: home/
Jun 30 22:05:13 arch sync.py[16940]: lib
Jun 30 22:05:13 arch sync.py[16940]: lib64
Jun 30 22:05:13 arch sync.py[16940]: proc/
Jun 30 22:05:13 arch sync.py[16940]: run/
Jun 30 22:05:13 arch sync.py[16940]: sbin
Jun 30 22:05:13 arch sync.py[16940]: sys/
Jun 30 22:05:13 arch sync.py[16940]: tmp/
Jun 30 22:05:13 arch sync.py[16940]: usr/
Jun 30 22:05:13 arch sync.py[16940]: var/
Jun 30 22:05:13 arch sync.py[16940]: no changes added to commit
Jun 30 22:05:14 arch sync.py[16940]: Everything up-to-date
Jun 30 22:05:14 arch sync.py[16940]: Syncing configuration files
Jun 30 22:05:14 arch sync.py[16940]: removed /home/shane/sync/public/config/bin
Jun 30 22:05:14 arch sync.py[16940]: removed /home/shane/sync/public/config/.bashrc
Jun 30 22:05:14 arch sync.py[16940]: removed /home/shane/sync/public/config/.config
Jun 30 22:05:14 arch sync.py[16940]: removed /home/shane/sync/public/config/.vim
Jun 30 22:05:14 arch sync.py[16940]: removed /home/shane/sync/public/config/.vimrc
Jun 30 22:05:14 arch sync.py[16940]: copied /home/shane/.config/awesome to /home/shane/sync/public/config/.config/awesome
Jun 30 22:05:14 arch sync.py[16940]: copied /home/shane/.config/cmus/playlists to /home/shane/sync/public/config/.config/cmus/playlists
Jun 30 22:05:14 arch sync.py[16940]: copied /home/shane/.config/cmus/autosave to /home/shane/sync/public/config/.config/cmus/autosave
Jun 30 22:05:14 arch sync.py[16940]: copied /home/shane/.config/cmus/shane.theme to /home/shane/sync/public/config/.config/cmus/shane.theme
Jun 30 22:05:14 arch sync.py[16940]: copied /home/shane/.vim/autoload to /home/shane/sync/public/config/.vim/autoload
Jun 30 22:05:14 arch sync.py[16940]: copied /home/shane/.vim/colors to /home/shane/sync/public/config/.vim/colors
Jun 30 22:05:14 arch sync.py[16940]: copied /home/shane/bin to /home/shane/sync/public/config/bin
Jun 30 22:05:14 arch sync.py[16940]: copied /home/shane/.bashrc to /home/shane/sync/public/config/.bashrc
Jun 30 22:05:14 arch sync.py[16940]: copied /home/shane/.vimrc to /home/shane/sync/public/config/.vimrc
Jun 30 22:05:14 arch sync.py[16940]: Encrypting private folder
Jun 30 22:05:14 arch sync.py[16940]: removing old
Jun 30 22:05:14 arch sync.py[16940]: compressing
Jun 30 22:05:14 arch sync.py[16940]: encrypting
Jun 30 22:05:14 arch sync.py[16940]: Pushing synced files
Jun 30 22:05:14 arch systemd[1]: sync.service: Succeeded.
Jun 30 22:05:14 arch systemd[1]: Stopped Sync, encrypt, and push important files.
-- Reboot --
Jun 30 22:05:57 arch systemd[1]: Started Sync, encrypt, and push important files.
$ ~/bin/sync.py
[master f1e3c29] synced 2019-06-30 22:18:33.882881
1 file changed, 0 insertions(+), 0 deletions(-)
rewrite private.tar.gz.gpg (93%)
Syncing configuration files
removed /home/shane/sync/public/config/bin
removed /home/shane/sync/public/config/.bashrc
removed /home/shane/sync/public/config/.config
removed /home/shane/sync/public/config/.vim
removed /home/shane/sync/public/config/.vimrc
copied /home/shane/.config/awesome to /home/shane/sync/public/config/.config/awesome
copied /home/shane/.config/cmus/playlists to /home/shane/sync/public/config/.config/cmus/playlists
copied /home/shane/.config/cmus/autosave to /home/shane/sync/public/config/.config/cmus/autosave
copied /home/shane/.config/cmus/shane.theme to /home/shane/sync/public/config/.config/cmus/shane.theme
copied /home/shane/.vim/autoload to /home/shane/sync/public/config/.vim/autoload
copied /home/shane/.vim/colors to /home/shane/sync/public/config/.vim/colors
copied /home/shane/bin to /home/shane/sync/public/config/bin
copied /home/shane/.bashrc to /home/shane/sync/public/config/.bashrc
copied /home/shane/.vimrc to /home/shane/sync/public/config/.vimrc
Encrypting private folder
removing old
compressing
encrypting
Pushing synced files
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 469.08 KiB | 12.03 MiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://bitbucket.org/*****/sync.git
7ba1c3c..f1e3c29 master -> master
답변1
--working-tree=/dir
git 명령에 추가해야 함