在 Ubuntu 環境透過 upstart init 所啟動的 daemon (服務),如需要改變狀態時則需要透過 #initctl 這個指令來進行互動 (RedHat 則是透過 systemctl ).所以 #initctl 這個指令在 upstart 環境佔蠻重要的地位,所以特別拿出來做說明.
關於 upstart 請先參考 https://benjr.tw/10578
- #initctl version (Request the version of the init daemon)
看目前 upstart 使用的版本.root@ubuntu:~# initctl version init (upstart 1.12.1)
- #initctl help (Display list of commands)
不知道要怎麼使用 initctl ,可以先看看 help 的說明.root@ubuntu:~# initctl help Job commands: start Start job. stop Stop job. restart Restart job. reload Send HUP signal to job. status Query status of job. list List known jobs. Event commands: emit Emit an event. Environment commands: get-env Retrieve value of a job environment variable. list-env Show all job environment variables. reset-env Revert all job environment variable changes. set-env Set a job environment variable. unset-env Remove a job environment variable. Other commands: reload-configuration Reload the configuration of the init daemon. version Request the version of the init daemon. log-priority Change the minimum priority of log messages from the init daemon. show-config Show emits, start on and stop on details for job configurations. check-config Check for unreachable jobs/event conditions. usage Show job usage message if available. notify-dbus-address Inform Upstart of D-Bus address to connect to. notify-disk-writeable Inform Upstart that disk is now writeable. list-sessions List all sessions. help display list of commands For more information on a command, try `initctl COMMAND --help'.
首先先來看 Job commands ,不過每次要打這麼長一串的指令,實在很累人,所以系統已經將一些常用的幾個參數建立好連結成為獨立的指令 如 reload, restart, start, status, stop 都是 initctl 的連結
- #initctl list (List known jobs)
list 主要就是看目前 job 的狀態清單root@ubuntu:~# initctl list avahi-cups-reload stop/waiting avahi-daemon start/running, process 540 mountall-net stop/waiting mountnfs-bootclean.sh start/running passwd stop/waiting initctl check-config Check for unreachable jobs/event conditions initctl emit Emit an event initctl get-env Retrieve a variable from the job environment table ...........
- #initctl status (Query status of job)
查詢單一 Job 的狀態, initctl status 指令太長可以直接使用 status 這個連結 /sbin/status -> initctl*root@ubuntu:~# initctl status bluetooth bluetooth start/running, process 5047 root@ubuntu:~# status bluetooth bluetooth start/running, process 5047
- #initctl start (Start job, 啟動指定的 Job)
initctl start 指令太長可以直接使用 status 這個連結 /sbin/start -> initctl* - #initctl stop (Stop job, 停止指定的 Job)
initctl stop 指令太長可以直接使用 status 這個連結 /sbin/stop -> initctl*root@ubuntu:~# initctl stop bluetooth bluetooth stop/waiting root@ubuntu:~# initctl start bluetooth bluetooth start/running, process 4943 root@ubuntu:~# stop bluetooth bluetooth stop/waiting root@ubuntu:~# start bluetooth bluetooth start/running, process 4943
restart 跟 reload 的使用不太一樣,
- #initctl restart (Restart job)
initctl restart 指令太長可以直接使用 restart 這個連結 /sbin/restart -> initctl* ,工作 Job 會被 殺害 Kill 和重生 respawned, 請注意, restart 不會重新讀取設定檔,如果需要重新讀取設定檔請使用 #stop job ,然後 #start job - #initctl reload (Send HUP signal to job)
initctl reload 指令太長可以直接使用 restart 這個連結 /sbin/reload -> initctl* ,這個指令會發送 SIGHUP 信號發送給該 Job,請該 Job 自行重新初始化本身,但需要注意的是相關的設定檔不重讀. - #initctl reload-configuration (Reload the configuration)
剛剛的 #initctl reload 不會重讀設定檔,所以需要重讀設定檔的請使用這個指令root@ubuntu:~# initctl reload bluetooth root@ubuntu:~# reload bluetooth root@ubuntu:~# initctl reload-configuration bluetooth root@ubuntu:~# initctl restart bluetooth bluetooth start/running, process 5243 root@ubuntu:~# restart bluetooth bluetooth start/running, process 5266
這邊看一下關於環境相關的指令,這邊的環境是指 Job 的環境跟 Linux 本身的環境設定 ( #env )好像不太一樣(我也不是很確定).
- #initctl list-env (Show all job environment variables.)
root@ubuntu:~# initctl list-env PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin TERM=linux
- #initctl get-env (Retrieve value of a job environment variable.)
- #initctl reset-env (Revert all job environment variable changes.)
- #initctl set-env (Set a job environment variable.)
- #initctl unset-env (Remove a job environment variable.)
initctl 指令並不能來設定該 service / Job 在開機的時候跑來在一個 runlevel ,而且 Ubuntu 並沒有提供類似 #chkconfig 的指令,只能透過 upstart 設定檔,以 SSH 的 upstart 設定檔案為例.
root@ben-virtual-machine:~# cat /etc/init/ssh.conf # ssh - OpenBSD Secure Shell server # # The OpenSSH server provides secure shell access to the system. description "OpenSSH server" start on runlevel [2345] stop on runlevel [!2345] respawn respawn limit 10 5 umask 022 env SSH_SIGSTOP=1 expect stop # 'sshd -D' leaks stderr and confuses things in conjunction with 'console log' console none pre-start script test -x /usr/sbin/sshd || { stop; exit 0; } test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; } mkdir -p -m0755 /var/run/sshd end script # if you used to set SSHD_OPTS in /etc/default/ssh, you can change the # 'exec' line here instead exec /usr/sbin/sshd -D
定義如下:
start on runlevel [2345]
stop on runlevel [!2345]
開機進入 runlevel 2345 的時候需要執行,切換到 runlevel 2345 (不一樣的 runlevel 時) 需要停止.
要注意一點的是 Ubuntu 的 runlevel 跟 RedHat 的不太一樣.
0 : System halt.
1 : Single-User mode.
2 : Graphical multi-user plus networking (DEFAULT)
3 : Same as “2”, but not used.
4 : Same as “2”, but not used.
5 : Same as “2”, but not used.
6 : System reboot.
4 thoughts on “Linux command – initctl (upstart)”