매일 날짜 기반 디렉터리에서 파일 세트(다양한 유형의 저널)를 시작하도록 systemd 서비스를 설정하려고 합니다. 예를 들어, 오늘의 할 일 목록은 다음과 같습니다.
~/Documents/Journals/2019/1/23/ToDo.md
지금 가장 쉬운 일은 그것을 별도의 디렉토리에 저장하는 것입니다. 예를 들어 오늘, 그리고 마지막 수정 시간이 더 이상 생성된 시간이 아니거나 파일 크기가 파일 크기보다 클 때 bash 스크립트를 사용하여 적절한 위치로 이동시킵니다. 템플릿 파일이 큽니다. 그러나 이것이 더 쉽지만 서비스에서 실행되는 명령을 통해 파이프될 파일의 디렉터리를 반환하는 스크립트를 작성할 수 있는지 알고 싶습니다. 대략 다음과 같습니다.
ExecStart=/usr/bin/atom | /Path/To/Script/Todays_Dir Todo.md
파일을 인수로 사용하고 날짜를 기준으로 디렉터리/파일 경로를 반환합니다(디렉터리 및 파일을 만드는 것과 같은 방식).
이것이 가능합니까, 아니면 이미 제안된 솔루션을 고수해야 합니까?
답변1
예, 대상 디렉터리에 직접 쓸 수 있습니다.
ExecStart=
systemd는 실제로 전체 셸을 구현하지 않기 때문에 실제로 파이프를 명령의 일부로 직접 사용할 수 없습니다 . 그러나 명시적으로 셸을 호출하면 작동하게 됩니다. 예를 들어:
ExecStart=/bin/sh -c '/usr/bin/atom | /Path/To/Script/Todays_Dir Todo.md'
그러나 인수의 전체 경로를 작성하기 위해 Todays_Dir
실행해야 하므로 이는 약간 어색한 것으로 드러납니다 . cat
실제로 여기에는 실제로 파이프가 필요하지 않습니다. 디렉토리 이름을 결정하고 atom
올바른 리디렉션으로 실행하기만 하면 됩니다.
스크립트의 모든 것을 구현하고 시스템 장치에서 직접 실행하는 것을 고려해보세요.
그것은 다음과 같습니다:
#!/bin/bash
set -e # exit on error
dated_dir=$HOME/Documents/Journals/$(date +%Y/%-m/%-d)
mkdir -p "${dated_dir}"
exec atom >"${dated_dir}/ToDo.md"
그런 다음 시스템 단위에서 다음을 수행하십시오.
ExecStart=/Path/To/Script/GenerateMarkdownToTodaysDir.sh
systemd가 설치 후 바로 실행되도록 쉘 스크립트 끝 exec
에서 shell을 프로그램으로 바꾸십시오 . 이 경우에는 그다지 중요하지 않으므로 생략할 수 있습니다(특히 실행 후 일종의 후처리를 수행하는 데 관심이 있는 경우 ).atom
atom
atom
답변2
"ExecStart=/usr/bin/atom /home/user/documents/journal/2019/1/23/todo.md" 라인을 따라 무언가를 할당하려고 합니다. 따라서 분명한 대답은 다음과 같습니다.
ExecStart="/usr/bin/atom /home/user/documents/journal/2019/1/23/todo.md"
하지만 지금은 그게 당신이 원하는 것 같아요.
/home/user…
명령에서 오는 경우 다음을 수행할 수 있습니다.
ExecStart="/usr/bin/atom $(command)"
또는
ExecStart='/usr/bin/atom "$(명령)"'
평가하기에는 너무 게으르다.