Bagaimana cara memulai layanan secara otomatis, ketika Ubuntu dimulai?


31

Saya menggunakan Ubuntu 12.04 dan ingin memulai layanan, ketika sistem di-boot secara normal.

Sebagai 'layanan' saya mengerti beberapa kode, misalnya cd my_directory; my_command -host 0.0.0.0 -port 1234 -arg x yang seharusnya dijalankan seolah-olah telah dimulai pada baris perintah. Ada layanan yang harus dimulai sebagai pengguna normal, tetapi juga layanan yang harus dimulai sebagai root (pada kenyataannya, tidak diperlukan layanan untuk dijalankan pada level pengguna).

Saya juga perlu mengonfigurasi perilaku ketika 'layanan' berhenti. Saya ingin mereka di-restart dalam kasus saya, dengan argumen yang sama, di direktori yang ditentukan.

Semua layanan harus dimulai secara otomatis ketika sistem dimulai dengan normal, yaitu jika saklar daya ditekan. Tidak ada tindakan lain yang harus dilakukan.

Ada beberapa dokumen yang tersebar di internet, tetapi semuanya membingungkan saya. Mereka bicara tentang init, init.d, rc.d, tapi aku tidak pernah melihat instruksi langkah-demi-langkah sederhana untuk mengikuti untuk dengan mudah sebagai layanan menggunakan misalnya pemula. Jika ini mudah, saya akan sangat menghargai jika langkah-langkah itu diberikan di sini.

Jawaban:


33

Untuk membuat pekerjaan dimulai secara otomatis saat Ubuntu dimulai, gunakan contoh yang diberikan di sini . Sebagai contoh tertulis, misalkan membuat file berikut /etc/init/testservice.confdengan sudo:

# testservice - test service job file

description "my service description"
author "Me <myself@i.com>"

# Stanzas
#
# Stanzas control when and how a process is started and stopped
# See a list of stanzas here: http://upstart.ubuntu.com/wiki/Stanzas

# When to start the service
start on runlevel [2345]

# When to stop the service
stop on runlevel [016]

# Automatically restart process if crashed
respawn

# Essentially lets upstart know the process will detach itself to the background
# This option does not seem to be of great importance, so it does not need to be set.
#expect fork

# Specify working directory
chdir /home/user/testcode

# Specify the process/command to start, e.g.
exec python mycommand.py arg1 arg2

Untuk 'secara manual' memulai atau menghentikan proses gunakan

sudo start testservice
sudo stop testservice

Lihat perintah kontrol pekerjaan .


Saya perlu "mulai di mulai mountall" untuk memulai layanan.
martinedwards

23

Ok, Alex, intinya adalah bahwa semua proses userspace di Linux dimulai dengan initproses, yang pid adalah 1. Misalnya, jalankan pstreeuntuk melihat pohon proses Anda, yang akarnya adalah init .. Ada beberapa versi initimplementasi proses saat ini , yang paling terkenal adalah

  • sysVinit (init klasik, masih digunakan oleh beberapa distribusi, termasuk Debian yang lebih lama)
  • Init pemula, digunakan oleh Ubuntu lama dan beberapa RHEL (Red Hat) dan versi Fedora yang lebih lama
  • systemd init, digunakan oleh versi modern Fedora, Ubuntu, Debian, RHEL, SUSE

Secara tradisional, Unix menggunakan implementasi init yang disebut sysVinitinit, disebut dengan nama https://ru.wikipedia.org/wiki/UNIX_System_V versi Unix. Ini sangat berpengaruh dan init lainnya kompatibel dengan itu.

Pada dasarnya, sysVinit pertama kali membaca /etc/inittabfile, memutuskan, runlevel mana yang akan dijalankan dan memberitahu /etc/init.d/rcskrip untuk mengeksekusi skrip init. Misalnya ketika biasanya melakukan booting ke runlevel multi-pengguna, yang biasanya runlevel 2 di Ubuntu , /etc/init.d/rcmulai menjalankan skrip /etc/rc2.d. File hanya ada tautan simbolis ke skrip, sedangkan skrip itu sendiri disimpan dalam /etc/init.ddirektori. Penamaan symlink dalam /etc/rc*.ddirektori adalah sebagai berikut. Katakanlah, kami memiliki skrip berikut di /etc/rc2.d:

$ls /etc/rc2.d
S16rsyslog
S17apache2
K02network-manager

Ini berarti, bahwa pada saat beralih ke runlevel 2 init proses pertama membunuh network-managerproses, menyebabkan nama skripnya dimulai dengan K- K02network-managerdan kemudian memulai proses, yang namanya dimulai dengan S. Dua digit setelah Satau Kadalah angka dari 00 hingga 99, yang menentukan urutan, proses dimulai. Misalnya rsyslogdimulai sebelumnya apache2, karena 16 kurang dari 17 (itu masuk akal, karena Anda ingin apache mengandalkan kapasitas logging rsyslog , jadi rsyslog harus dimulai terlebih dahulu). Skrip adalah skrip kasual, dijalankan oleh #!/bin/sh.

Jadi, pada dasarnya untuk memulai sebuah program saat startup dalam gaya sysVinit, tulis skrip Anda sendiri (salin-tempel dari contoh apa pun, Anda dapat /etc/init.d), letakkan di dalamnya /etc/init.ddan buat symlink ke sana dengan nama yang masuk akal, misalnya S99mytrojandi /etc/rc2.d. Berikut ini penjelasan tentang skrip sysVinit pada /etc/init.d http://docs.oracle.com/cd/E19683-01/806-4073/6jd67r96g/index.html

Sekarang, orang-orang Ubuntu memutuskan bahwa mereka menginginkan fungsionalitas tambahan dari init. Mereka menginginkan OS booting cepat, jadi mereka ingin skrip mereka dieksekusi secara paralel; mereka ingin proses mati dimulai kembali secara otomatis; mereka ingin proses untuk saling memanggil secara eksplisit oleh peristiwa (sehingga apache dijalankan oleh acara "syslog dimulai", dan syslog dijalankan oleh peristiwa "mount sistem file" dll, jadi kami memiliki acara bukannya beberapa angka 00 -99). Dengan demikian, mereka telah membuat Upstart dan inilah cara kerjanya. Skrip init pemula dimasukkan ke dalam /etc/initdirektori (jangan bingung dengan /etc/init.d). Pemula biasanya berjalan /etc/init.d/rcjuga, jadi itu akan mengeksekusi skrip sysVinit Anda secara normal. Tetapi jika Anda ingin skrip Anda direspawn saat keluar - Peristiwa pemula adalah untuk Anda.

Meskipun saya tidak dapat memeriksa apakah skrip saya berfungsi, saya kira, bahwa untuk tujuan Anda, Anda harus menulis /etc/init/mytrojan.confskrip berikut :

start on runlevel [02]
respawn
exec mytrojan --argument X 

Tetapi jika Anda membutuhkan dependensi, setidaknya sistem file dan jaringan, mungkin masuk akal untuk mengganti start on runlevel [02]dengan sesuatu seperti:

start on (local-filesystems and net-device-up IFACE!=lo)

PERINGATAN: Saya tidak memeriksa kebenaran ini, karena saya tidak bisa. Terutama, saya tidak begitu yakin tentang cara memulai skrip setelah koneksi jaringan Anda aktif dan berjalan (saya menggunakan versi ini ). Coba googling untuk "pemula pada jaringan atas".


1
Ini adalah gambaran yang sangat bagus tentang sejarah proses yang dimulai di Linux, tetapi tidak menjawab dengan pertanyaan. Saya masih belum tahu cara 'membuat' proses pemula. Saya juga hanya ingin menggunakannya, tidak mengerti sedikit pun tentang cara kerjanya. Saya hanya ingin memiliki contoh kerja yang sederhana dan mudah digunakan, tentang cara membuat proses untuk dimulai dan direspawn secara otomatis dengan pemula Ubuntu ub..l.
Alex

@Alex: diperbarui dengan scipt sampel. Perhatikan, bahwa skrip saya mungkin salah. Saya melakukannya dalam semangat alexreisner.com/code/upstart .
Boris Burkov

1
Terpilih karena ini adalah salah satu jawaban terbaik yang pernah saya baca.
user1301428
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.