Đây là một công việc rất phù hợp cho systemd
.
Chạy một kịch bản như một dịch vụ systemd
Nếu hệ thống của bạn đang chạy systemd , thì bạn có thể định cấu hình tập lệnh của mình để chạy như một dịch vụ systemd cung cấp quyền kiểm soát vòng đời và môi trường thực thi, cũng như các điều kiện tiên quyết để bắt đầu tập lệnh, như mạng đang hoạt động.
Thư mục được đề xuất cho các dịch vụ của riêng bạn là /etc/systemd/system/
(tùy chọn khác là /lib/systemd/system
nhưng thông thường chỉ được sử dụng cho các dịch vụ OOTB).
Tạo tệp, ví dụ sudo vim /etc/systemd/system/autossh.service
:
[Unit]
# By default 'simple' is used, see also https://www.freedesktop.org/software/systemd/man/systemd.service.html#Type=
# Type=simple|forking|oneshot|dbus|notify|idle
Description=Autossh keepalive daemon
## make sure we only start the service after network is up
Wants=network-online.target
After=network.target
[Service]
## here we can set custom environment variables
Environment=AUTOSSH_GATETIME=0
Environment=AUTOSSH_PORT=0
ExecStart=/usr/local/bin/ssh-keep-alive.sh
ExecStop=pkill -9 autossh
# don't use 'nobody' if your script needs to access user files
# (if User is not set the service will run as root)
#User=nobody
# Useful during debugging; remove it once the service is working
StandardOutput=console
[Install]
WantedBy=multi-user.target
Bây giờ bạn có thể kiểm tra dịch vụ:
sudo systemctl start autossh
Kiểm tra trạng thái của dịch vụ:
systemctl status autossh
Dừng dịch vụ:
sudo systemctl stop autossh
Khi bạn xác minh rằng dịch vụ hoạt động như mong đợi, hãy kích hoạt nó với:
sudo systemctl enable autossh
LƯU Ý: Vì mục đích bảo mật systemd
sẽ chạy tập lệnh trong môi trường bị hạn chế, tương tự như cách crontab
tập lệnh được chạy, do đó, không đưa ra bất kỳ giả định nào về các biến hệ thống có sẵn như $ PATH. Sử dụng các Environment
khóa nếu tập lệnh của bạn cần các biến cụ thể được xác định. Thêm set -x
vào đầu tập lệnh bash của bạn và sau đó chạy systemctl status my_service
có thể giúp xác định lý do tại sao tập lệnh của bạn bị lỗi. Theo quy tắc, luôn luôn sử dụng các đường dẫn tuyệt đối cho tất cả mọi thứ bao gồm echo
hoặc xác định rõ ràng $ PATH của bạn bằng cách thêm Environment=MYVAR=abc
.