시스템 서비스에서 Exec 파이프를 통한 출력 스크립트?

시스템 서비스에서 Exec 파이프를 통한 출력 스크립트?

매일 날짜 기반 디렉터리에서 파일 세트(다양한 유형의 저널)를 시작하도록 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을 프로그램으로 바꾸십시오 . 이 경우에는 그다지 중요하지 않으므로 생략할 수 있습니다(특히 실행 후 일종의 후처리를 수행하는 데 관심이 있는 경우 ).atomatomatom

답변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 "$(명령)"'

평가하기에는 너무 게으르다.

관련 정보