현재 모든 crontab 구성을 systemd-services로 이식하는 중입니다. 즉, 내 컴퓨터에서 자동으로 시작되어야 하는 작업을 위한 단위를 만드는 중입니다.
장치 중 하나가 나에게 두통을 안겨주었습니다. 저는 이를 "uplink.service"라고 부르겠습니다. 그 목적은 스크립트를 호출하여 서버에 대한 역방향 SSH 터널을 구축하고 해당 터널을 설정하는 것입니다. 제가 만든 유닛은 다음과 같습니다.
[Unit]
Description = SSH-Uplink
After = network.target
[Service]
ExecStart = /bin/bash /root/script/uplink.sh
[Install]
WantedBy = multi-user.target
유닛이 가리키는 스크립트는 다음과 같습니다.
ssh -fNC -R XXXX:localhost:22 user@ip -pXXXX -i ~/script/id_rsa
touch /tmp/uplinkonline
보시다시피, 디버깅 목적으로 이 스크립트는 /tmp에 uplinkonline이라는 새 파일을 생성하려고 시도합니다. 이것은 작동합니다. 서비스를 시작한 후에 파일이 생성되므로 스크립트 자체가 성공적으로 호출됩니다.
이것은 systemctl을 시작하려고 시도한 후의 출력입니다.
uplink.service - SSH-Uplink
Loaded: loaded (/etc/systemd/system/uplink.service; disabled;
vendor preset: disabled)
Active: inactive (dead)
Nov 07 10:44:01 loki systemd[1]: Started SSH-Uplink.
스크립트 자체는 수동으로 시작하거나 crontab을 통해 호출할 때 작동합니다. 그러나 어떻게 든 systemd는 SSH 연결을 시작하지 않고 다른 동작과 종료를 예상하는 것 같습니다. 내가 뭘 잘못했나요?
답변1
스크립트는 ssh
백그라운드에서 시작되어 지속되지 않는 반면 systemd는 서비스가 시작될 때 실행되는 프로그램이 계속 실행되기를 원합니다.
Type=oneshot
당신이 해야 할 일은 서비스 단위에서 이를 구성하여 이것이 일회성 서비스임을 systemd에 알리는 것뿐입니다. RemainAfterExit=yes
systemd가 지속적으로 서비스를 "up"으로 나열하도록 이를 포함할 수도 있습니다 .
즉, 서비스 파일을 다음과 같이 업데이트하십시오.
[Unit]
Description=SSH-Uplink
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/bash /root/script/uplink.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
(시스템 단위 파일의 스톡 스타일에는 "=" 주위에 공백이 없으므로 이 부분도 수정했습니다.)
예상대로 작동 ExecStop=
하도록 SSH 터널을 해제하는 명령을 추가하는 것을 고려할 수 있습니다 .systemctl stop uplink