ಕೆಲಸ ಮಾಡುವ ಕಮಾಂಡ್ ಸಾಲನ್ನು ExecStart ಗೆ ನಕಲಿಸಿ, ಮರುಲೋಡ್ ಮಾಡಿ, ಮತ್ತು ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗಳನ್ನು ಫೈಲ್ ಹೆಸರುಗಳೆಂದು ಪರಿಗಣಿಸಿ ಯುನಿಟ್ ವಿಫಲವಾಗುತ್ತದೆ ಅಥವಾ ಮೌನವಾಗಿ ನಿರ್ಗಮಿಸುತ್ತದೆ. systemd ನಲ್ಲಿ ಏನೂ ಮುರಿದಿಲ್ಲ. ExecStart ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗಳ ಪಟ್ಟಿ, shell ಅಲ್ಲ, ಆದ್ದರಿಂದ ಪೈಪ್, ರೀಡೈರೆಕ್ಷನ್ ಮತ್ತು ಷರತ್ತುಗಳು ನಿಮ್ಮ ಟರ್ಮಿನಲ್ ಬಿಟ್ಟ ಕ್ಷಣವೇ ಅರ್ಥ ಕಳೆದುಕೊಳ್ಳುತ್ತವೆ. shell ಎಲ್ಲಿರಬೇಕೆಂದು ನಿರ್ಧರಿಸಿ, ನಂತರ ಏನು ನಿರ್ವಹಿಸಬೇಕೆಂದು ನಿಖರವಾಗಿ ಹೇಳುವ ಯುನಿಟ್ ಬರೆಯಿರಿ.

ExecStart ನಲ್ಲಿನ ಪೈಪ್‌ಲೈನ್ ಏಕೆ ಏನೂ ಮಾಡುವುದಿಲ್ಲ

ಟರ್ಮಿನಲ್‌ನಲ್ಲಿ ಕಮಾಂಡ್ ಟೈಪ್ ಮಾಡಿದಾಗ shell ಮೊದಲು ಅದನ್ನು ವಿಶ್ಲೇಷಿಸುತ್ತದೆ. ಅದು ಪೈಪ್‌ಲೈನ್ ಕಟ್ಟುತ್ತದೆ, ರೀಡೈರೆಕ್ಷನ್‌ಗಾಗಿ ಫೈಲ್‌ಗಳನ್ನು ತೆರೆಯುತ್ತದೆ ಮತ್ತು ಯಾವುದೇ ಪ್ರೋಗ್ರಾಂ ಪ್ರಾರಂಭವಾಗುವ ಮೊದಲು ಚರಗಳನ್ನು ವಿಸ್ತರಿಸುತ್ತದೆ. systemd ಇವುಗಳಲ್ಲಿ ಯಾವುದನ್ನೂ ಮಾಡುವುದಿಲ್ಲ: ಅದು ತನ್ನದೇ ನಿಯಮಗಳ ಪ್ರಕಾರ ExecStart ಅನ್ನು ವಿಭಜಿಸಿ ಫಲಿತಾಂಶದ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಆ ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗಳೊಂದಿಗೆ ಚಲಾಯಿಸುತ್ತದೆ. ಆದ್ದರಿಂದ > ಅಕ್ಷರಶಃ ಆರ್ಗ್ಯುಮೆಂಟ್ ಆಗಿ ಬರುತ್ತದೆ, ಮತ್ತು | ಎರಡು ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ಜೋಡಿಸುವ ಬದಲು ಪ್ರೋಗ್ರಾಂಗೆ ಒಪ್ಪಿಸಲಾಗುತ್ತದೆ. ಯುನಿಟ್ ತಪ್ಪಾಗಿ ವರ್ತಿಸುತ್ತಿಲ್ಲ; ವಾಕ್ಯರಚನೆ ಬೇರೆ ಏನನ್ನೋ ಸೂಚಿಸುತ್ತಿತ್ತು.

ಇದು ನಿರ್ಲಕ್ಷ್ಯವಲ್ಲ, ಉದ್ದೇಶಪೂರ್ವಕ, ಏಕೆಂದರೆ ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗಳ ಮುನ್ಸೂಚನೀಯ ನಿರ್ವಹಣೆಯೇ ಯುನಿಟ್‌ಗಳನ್ನು ಲೆಕ್ಕಪರಿಶೋಧನೆಗೆ ಒಳಪಡಿಸುತ್ತದೆ. shell ಇದೆ ಎಂದು ಭಾವಿಸುವವರಿಗೆ ಮಾತ್ರ ಇದು ಆಶ್ಚರ್ಯ.

ಏನು ಚಲಿಸುತ್ತದೆ ಎಂದು ನಿಖರವಾಗಿ ಹೇಳುವ ಯುನಿಟ್ ಬರೆಯಿರಿ

ಜರ್ನಲ್‌ನಲ್ಲಿ ಉದ್ದೇಶ ಕಾಣುವ ಸಣ್ಣ ಯುನಿಟ್‌ನಿಂದ ಪ್ರಾರಂಭಿಸಿ, ಇದರಿಂದ ವಿಶ್ಲೇಷಣಾ ಸಮಸ್ಯೆಗಳು ಸುರಂಗ ಸಮಸ್ಯೆಗಳಿಂದ ಪ್ರತ್ಯೇಕವಾಗಿರುತ್ತವೆ. ಇದು ಬೈನರಿಯ ಆವೃತ್ತಿಯನ್ನು ಮಾತ್ರ ವರದಿ ಮಾಡುತ್ತದೆ.

[Unit]
Description=Report the installed OpenVPN version

[Service]
Type=oneshot
ExecStart=/usr/sbin/openvpn --version
StandardOutput=journal
StandardError=journal

ಮಾರ್ಗವು ಪ್ಲೇಸ್‌ಹೋಲ್ಡರ್, ಆದ್ದರಿಂದ ನಿಜವಾಗಿ ಸ್ಥಾಪಿತವಾದ ಬೈನರಿಯನ್ನು ಹಾಕಿ. Type=oneshot ಕೊನೆಯವರೆಗೆ ಚಲಿಸುವ ಕಮಾಂಡ್‌ಗೆ ಸರಿಹೊಂದುತ್ತದೆ, ಮತ್ತು ಜರ್ನಲ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಅದರ ಔಟ್‌ಪುಟ್ ಅನ್ನು ಟರ್ಮಿನಲ್ ಇಲ್ಲದೆ ಓದಬಹುದಾದ ಸ್ಥಳದಲ್ಲಿ ಇಡುತ್ತವೆ. ಉದ್ದೇಶಪೂರ್ವಕವಾಗಿ ಸ್ಥಾಪನಾ ವಿಭಾಗವಿಲ್ಲ, ಆದ್ದರಿಂದ ಯುನಿಟ್ ಬೂಟ್‌ನಲ್ಲಿ ಸಕ್ರಿಯವಾಗುವ ಬದಲು ಕೈಯಿಂದ ಕರೆಯಲ್ಪಡುತ್ತದೆ. ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು ಫೈಲ್ ಪರಿಶೀಲಿಸಿ, ಏಕೆಂದರೆ ನಿರ್ದೇಶದ ಹೆಸರಿನಲ್ಲಿನ ಟೈಪೊ ಮಾರ್ಗದಲ್ಲಿನ ಟೈಪೊಗಿಂತ ಬೇರೆ ರೀತಿಯಲ್ಲಿ ವಿಫಲವಾಗುತ್ತದೆ.

systemd-analyze verify /etc/systemd/system/openvpn-version.service
systemctl start openvpn-version.service

shell ತರ್ಕವನ್ನು ಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿ ಇರಿಸಿ

ಸಹಾಯಕನಿಗೆ ನಿಜವಾಗಿಯೂ ಷರತ್ತುಬದ್ಧ ತರ್ಕ ಬೇಕಾದಾಗ, ಆ ತರ್ಕವನ್ನು ಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿ ಇರಿಸಿ ಮತ್ತು ಸ್ಪಷ್ಟವಾಗಿ ಕರೆಯಿರಿ. ಸ್ಕ್ರಿಪ್ಟ್‌ಗೆ ಇಂಟರ್ಪ್ರಿಟರ್ ಸಾಲು, ಚಲಾಯಿಸುವ ಅನುಮತಿ ಮತ್ತು ಸೇವೆ ವರದಿ ಮಾಡಬಹುದಾದ ನಿರ್ಗಮನ ಕೋಡ್‌ಗಳು ಬೇಕು. /bin/sh -c ಅನ್ನು ಉಲ್ಲೇಖಿತ ಕಮಾಂಡ್‌ನೊಂದಿಗೆ ಚಲಾಯಿಸುವುದು ಕೆಲಸ ಮಾಡುತ್ತದೆ, ಆದರೆ ಅದು ಉಲ್ಲೇಖ ನಿಯಮಗಳನ್ನು ಯುನಿಟ್ ಒಳಗೆ ಮರೆಮಾಡಿ ಪರಿಶೀಲನೆಯನ್ನು ಕಷ್ಟಕರಗೊಳಿಸುತ್ತದೆ. ಹೆಸರಿಸಿದ ಸ್ಕ್ರಿಪ್ಟ್ ಅನ್ನು ಕೈಯಿಂದ ಪರೀಕ್ಷಿಸಿ ನಂತರ ಯುನಿಟ್ ಸಂಪಾದಿಸದೆ ಬದಲಾಯಿಸಬಹುದು. ಸಂವಾದಾತ್ಮಕ ಬಳಕೆದಾರರ shell ಪ್ರೊಫೈಲ್ ಅನ್ನು ಅವಲಂಬಿಸಬೇಡಿ, ಏಕೆಂದರೆ ಸೇವೆ ತನ್ನದೇ ಪರಿಸರದೊಂದಿಗೆ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ.

ಸಾಪೇಕ್ಷ ಮಾರ್ಗಗಳು ಮುಖ್ಯವಾದಾಗ WorkingDirectory ಅನ್ನು ಹೊಂದಿಸಿ, ಮತ್ತು ಪರಿಸರವನ್ನು ಟರ್ಮಿನಲ್‌ನಲ್ಲಿ ರಫ್ತು ಮಾಡುವ ಬದಲು ಯುನಿಟ್‌ನ ಬೆಂಬಲಿತ ನಿರ್ದೇಶಗಳ ಮೂಲಕ ರವಾನಿಸಿ. ರಹಸ್ಯಗಳು ಸಂರಕ್ಷಿತ ಫೈಲ್‌ಗಳಲ್ಲಿ ಅಥವಾ ರುಜುವಾತುಗಳಲ್ಲಿ ಇರುತ್ತವೆ, ಜರ್ನಲ್ ದಾಖಲಿಸಬಹುದಾದ ಆರ್ಗ್ಯುಮೆಂಟ್ ಪಟ್ಟಿಗಳಲ್ಲಿ ಅಲ್ಲ.

ನಿಜವಾಗಿ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಯುನಿಟ್ ಪರಿಶೀಲಿಸಿ

drop-in ಫೈಲ್‌ಗಳು ನೀವು ಸಂಪಾದಿಸಿದೆ ಎಂದು ನೆನಪಿರುವ ಫೈಲ್ ಅನ್ನು ಮುಟ್ಟದೆ ವರ್ತನೆ ಬದಲಾಯಿಸುತ್ತವೆ. ನಿರ್ವಾಹಕ ಏನು ಲೋಡ್ ಮಾಡಿತು ಮತ್ತು ಕೊನೆಯ ಓಟ ಏನು ವರದಿ ಮಾಡಿತು ಎಂದು ಓದಿ.

systemctl cat vpn-helper.service
journalctl -u vpn-helper.service -n 20 --no-pager

ಯುನಿಟ್ ಡಂಪ್ ಲೋಡ್ ಕ್ರಮದಲ್ಲಿ drop-in ಫೈಲ್‌ಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ, ಮತ್ತು ಅನಿರೀಕ್ಷಿತ ExecStart ಸಾಮಾನ್ಯವಾಗಿ ಅಲ್ಲಿಂದಲೇ ಬರುತ್ತದೆ. ಯಾವುದೇ ಬದಲಾವಣೆಯ ನಂತರ ನಿರ್ವಾಹಕವನ್ನು ಮರುಲೋಡ್ ಮಾಡಿ ಮತ್ತು ಹೊಸ ವ್ಯಾಖ್ಯಾನವೇ systemctl cat ಮುದ್ರಿಸುವುದು ಎಂದು ಖಚಿತಪಡಿಸಿ. ಜರ್ನಲ್ ನಿಖರ ಕಮಾಂಡ್ ಸಾಲು ಮತ್ತು ನಿರ್ಗಮನ ಸ್ಥಿತಿಯನ್ನು ತೋರಿಸುತ್ತದೆ, ಇದು ಆರ್ಗ್ಯುಮೆಂಟ್ ಸಮಸ್ಯೆಯನ್ನು ಕಾಣೆಯಾದ ಬೈನರಿ ಅಥವಾ ಅನುಮತಿ ದೋಷದಿಂದ ಪ್ರತ್ಯೇಕಿಸುತ್ತದೆ. ನಂತರ ಸಹಾಯಕವು ಇರುವ VPN ಜೀವನಚಕ್ರಕ್ಕೆ ಸೇರಿದೆಯೇ ಅಥವಾ ಕೈಯಿಂದ ಮಾಡುವ ರೋಗನಿರ್ಣಯವಾಗಿ ಉಳಿಯಬೇಕೇ ಎಂದು ನಿರ್ಧರಿಸಿ, ಏಕೆಂದರೆ ಎರಡನೇ ಹಿನ್ನೆಲೆ ಸುರಂಗ ಪ್ರಕ್ರಿಯೆ ಸ್ಪರ್ಧಿ ಮಾಲೀಕನನ್ನು ಸೃಷ್ಟಿಸುತ್ತದೆ.

ಬೇಡಿಕೆಯ ಮೇರೆಗೆ ಸರಿಯಾದ ಔಟ್‌ಪುಟ್ ಮುದ್ರಿಸುವ ಯುನಿಟ್ ಒಳ್ಳೆಯ ಮೊದಲ ಮೈಲಿಗಲ್ಲು. ಅದು ಇನ್ನೂ ಸುರಂಗವಲ್ಲ, ಮತ್ತು ಸುರಂಗ ಎಂಬಂತೆ ನಟಿಸಬಾರದು.

ಸಂಬಂಧಿತ ಲೇಖನಗಳು