jessie後取消了init, 改用了systemd, 因此沒有rc.local. 網路上不少使用rc.local的方式, 畢竟官方都不用了, 總是要學習新方式.(crontab?)
在 /etc/system/systemd/ 建一個 FileName.target 的檔案, 並分為以下區塊.
[Unit]
Description=A description for this service unit.
After=network.target
[Service]
type=simple
# User=user
# Group=group
# WorkingDirectory=/path/to/folder
ExecStart=/path/to/program [arguments]
Restart=always
ExecStop
RestartSec=3s
# Environment="VARIABLE_1=VALUE_1" "VARIABLE_2=VALUE_2"
# Environment="VARIABLE_3=VALUE_3" "VARIABLE_4=VALUE_4"
[Install]
WantedBy=multi-user.target
[Unit]
before/after: 關於這個, 需要了解systemd啟動的順序.
由以下的指令可以查到這個服務啟動花了多少時間
systemd-analyze blame
systemd-analyze plot > boot.svg
systemd-analyze plot > boot.html
type:
Type=simple(預設值):systemd認為該服務將立即啟動。服務程序不會fork。如果該服務要啟動其他服務,不要使用此類型啟動,除非該服務是socket激活型。
Type=forking:systemd認為當該服務程序fork,且父程序退出後服務啟動成功。對於常規的守護程序(daemon),除非你確定此啟動方式無法滿足需求,使用此類型啟動即可。使用此啟動類型應該同時指定 PIDFile=,以便systemd能夠跟蹤服務的主程序。
Type=oneshot:這一選項適用於只執行一項任務、隨後立即退出的服務。可能需要同時設定 RemainAfterExit=yes 使得 systemd 在服務程序退出之後仍然認為服務處於激活狀態。
Type=notify:與 Type=simple 相同,但約定服務會在就緒後向 systemd 發送一個信號。這一通知的實現由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式啟動,當指定的 BusName 出現在D-Bus系統總線上時,systemd認為服務就緒。
Type=idle: systemd會等待所有工作處理完成後,才開始執行idle類型的單元。其他行為和Type=simple 類似。
# systemctl daemon-reload
# 如果要開機自動啟動
# systemctl enable FileName.service
# 如果只是手動啟動
# systemctl start FileName.service
# 檢查狀態
# systemctl status
# journalctl -u Filename.service
# journalctl -u FileName.server -p log檔level
有的時候會不成功