Làm cách nào để chạy một lệnh đơn khi khởi động bằng systemd?


113

Tôi muốn khởi động cụm Apache Spark sau khi khởi động bằng lệnh sau:

sudo ./path/to/spark/sbin/start-all.sh

Sau đó chạy lệnh này khi hệ thống chuẩn bị khởi động lại / tắt máy:

sudo ./path/to/spark/sbin/stop-all.sh

Làm thế nào tôi có thể bắt đầu? Có một mẫu cơ bản nào tôi có thể xây dựng không?

Tôi đã thử sử dụng một cách cực kỳ đơn giản (tệp /lib/systemd/system/spark.service:):

[Unit]
Description=Spark service

[Service]
ExecStart=sudo ./path/to/spark/sbin/start-all.sh

Mà không làm việc.


Có một cái nhìn tại địa chỉ: wiki.ubuntu.com/SystemdForUpstartUsers

Xin chào @WillemK, tôi đã xem trang này rồi. Vấn đề này tôi thấy là tôi không thể thay thế execbằng ExecStart=. Thêm vào đó, tôi chưa từng sử dụng trước đây.
macourtney7

1
Dấu chấm trước đường dẫn của tập lệnh của bạn trông cực kỳ đáng ngờ.
Andrea Lazzarotto

@AndreaLazzarotto Tôi nghĩ OP đang cố chạy kịch bản theo cách OP sẽ làm trong thiết bị đầu cuối do đó ....
George Udosen

Xin chào @AndreaLazzarotto, điều này là chính xác. Xin lỗi cho bất kỳ sự nhầm lẫn gây ra.
macourtney7

Câu trả lời:


144

Tệp của bạn .servicesẽ trông như thế này:

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target

Bây giờ làm một vài bước nữa để kích hoạt và sử dụng .servicetệp:

  1. Đặt nó trong /lib/systemd/systemthư mục với tên củamyfirst.service

  2. Làm cho tập lệnh của bạn có thể thực thi được với:

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. Bắt đầu làm đi:

    sudo systemctl start myfirst
    
  4. Cho phép nó chạy khi khởi động:

    sudo systemctl enable myfirst
    
  5. Dừng lại:

    sudo systemctl stop myfirst
    

Ghi chú:

  1. Bạn không cần khởi chạy Spark với sudo trong dịch vụ của mình, vì người dùng dịch vụ mặc định đã root.

  2. Nhìn vào các liên kết dưới đây để có thêm systemdtùy chọn.

CẬP NHẬT

Bây giờ những gì chúng tôi có ở trên chỉ là thô sơ, đây là một thiết lập hoàn chỉnh cho tia lửa:

[Unit]
Description=Apache Spark Master and Slave Servers
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=spark
Type=forking
ExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
ExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.sh
TimeoutSec=30
Restart=on-failure
RestartSec=30
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

Để thiết lập dịch vụ:

sudo systemctl start spark.service
sudo systemctl stop spark.service
sudo systemctl enable spark.service

đọc thêm

Xin vui lòng đọc qua các liên kết sau đây. Spark là một thiết lập phức tạp, vì vậy bạn nên hiểu cách nó tích hợp với dịch vụ init của Ubuntu.

https://datasciencenovice.wordpress.com/2016/11/30/spark-stand-opol-cluster-as-a-systemd-service-ubfox-16-04centos-7/

https://www.digitalocean.com/community/tutorials/under Hiểu-systemd-units-and-unit-files

https://www.freedesktop.org/software/systemd/man/systemd.unit.html


Lưu ý và cập nhật
George Udosen

1
Cảm ơn vì điều này, tôi đã tạo một tệp dựa trên những gì bạn đề xuất. Khi chạy sudo systemctl start sparklà nhận được lỗi sau:Failed to start spark.service: Unit spark.service is not loaded properly: Invalid argument. See system logs and 'systemctl status spark.service' for details.
macourtney7

Phần chính của systemctl status spark.servicenhư sau: Executable path is not absolutespark.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
macourtney7

Các vấn đề là 1) Đường dẫn nhị phân Spark (nên thay thế những gì chúng ta có trong tệp dịch vụ) là cần thiết, 2) Spark có lệnh tắt nó là gì. 3) Bạn đã đi qua các liên kết tôi đã cho bạn. Tôi không sử dụng tia lửa để cung cấp cho họ
George Udosen

@GeorgeUdosen Cám ơn câu trả lời của bạn, câu hỏi của tôi là làm thế nào tôi có thể chạy tia lửa dưới một lệnh cụ thể sau khi khởi động lại Câu hỏi đặt ra là ở đây? Askubuntu.com/questions/979498/...
Soheil Pourbafrani

2

Điều này tạo và chạy /root/boot.shkhi khởi động (với quyền root) bằng tệp dịch vụ tối thiểu:

bootscript=/root/boot.sh
servicename=customboot

cat > $bootscript <<EOF
#!/usr/bin/env bash
echo "$bootscript ran at $(date)!" > /tmp/it-works
EOF

chmod +x $bootscript

cat > /etc/systemd/system/$servicename.service <<EOF
[Service]
ExecStart=$bootscript
[Install]
WantedBy=default.target
EOF

systemctl enable $servicename

Bạn có thể Ctrl+ Ccái này vào một thiết bị đầu cuối gốc.

Để sửa đổi các tham số, ví dụ để sử dụng khác $bootscript, hãy đặt biến đó theo cách thủ công và chỉ bỏ qua dòng đó khi sao chép các lệnh.

Sau khi chạy các lệnh, bạn có thể chỉnh sửa tập lệnh khởi động bằng trình chỉnh sửa yêu thích của mình và nó sẽ chạy trong lần khởi động tiếp theo. Bạn cũng có thể chạy nó ngay lập tức bằng cách sử dụng:

systemctl start $servicename

Mỗi bước có thể được thực hiện với sudo, nhưng nó phức tạp hơn một chút và một số hệ thống chưa cài đặt sudo nên một số người sẽ phải sửa đổi ví dụ trước khi sử dụng. Vì vậy, tôi đã chọn không bao gồm sudo trong ví dụ.


Tôi hơi bối rối bởi các tài liệu systemd, nhưng không nên Type=oneshot RemainAfterExit=yeshoặc systemd sẽ xem xét tác vụ không hoạt động trừ khi tập lệnh tùy chỉnh để một số tiến trình chạy.
Peter Lamberg

@PeterLamberg Tôi cũng đã thử đọc tài liệu systemd và cả hai chúng tôi đều ở đây;). Tôi nhớ rằng họ không rõ ràng lắm, nhưng câu trả lời tôi đã đăng hoạt động cho tôi trên nhiều hệ thống (tôi truy cập lại trang này mỗi lần và sau đó khi tôi cần lại). Bạn có nghĩa là, bởi vì nó được coi là 'không hoạt động', mọi cuộc gọi 'bắt đầu' liên tiếp sẽ chạy lại tập lệnh? Bởi vì tôi sẽ xem xét điều đó như mong đợi cho một kịch bản shell. Tôi thấy thật kỳ lạ nếu tôi phải 'dừng lại' thứ gì đó không thực sự chạy trước khi tôi có thể bắt đầu lại.
Luc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.