Cara menjalankan skrip shell saat startup

367

Pada instance Amazon S3 Linux, saya memiliki dua skrip yang dipanggil start_my_appdan stop_my_appyang memulai dan berhenti selamanya (yang pada gilirannya menjalankan aplikasi Node.js saya). Saya menggunakan skrip ini untuk memulai dan menghentikan aplikasi Node.js secara manual. Sejauh ini bagus.

Masalah saya: Saya juga ingin mengaturnya agar start_my_appdijalankan setiap kali sistem dinyalakan. Saya tahu bahwa saya perlu menambahkan file di dalamnya init.ddan saya tahu cara menyinkronkannya ke direktori yang benar di dalamnya rc.d, tetapi saya tidak tahu apa yang sebenarnya perlu masuk ke dalam file yang saya tempatkan init.d. Saya pikir itu seharusnya hanya satu baris, seperti start_my_app, tetapi itu tidak berhasil untuk saya.

meetamit
sumber
5
Saya bukan ahli dalam hal-hal semacam ini, tapi saya pikir init.dsolusinya (di sini ) harus lebih disukai daripada rc.localsolusi karena yang terakhir adalah perkakas lama yang hanya masih dapat digunakan karena perkakas baru itu kompatibel ke belakang.
erikbwork
pm2 mulai my_app; startup PM2; pm2 save github.com/Unitech/pm2
Unitech

Jawaban:

292

Dalam file yang Anda masukkan /etc/init.d/Anda harus mengaturnya dapat dieksekusi dengan:

chmod +x /etc/init.d/start_my_app

Terima kasih kepada @meetamit, jika ini tidak berjalan, Anda harus membuat symlink /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/

Harap perhatikan bahwa pada Debian terbaru, ini tidak akan berfungsi karena skrip Anda harus sesuai dengan LSB (sediakan, setidaknya, tindakan berikut: mulai, berhenti, mulai ulang, muat ulang paksa, dan status): https: //wiki.debian .org / LSBInitScripts

Sebagai catatan, Anda harus meletakkan path absolut skrip Anda alih-alih relatif, skrip ini dapat memecahkan masalah yang tidak terduga:

/var/myscripts/start_my_app

Dan jangan lupa untuk menambahkan di atas file itu:

#!/bin/sh
Jonathan Muller
sumber
6
Saya melakukan ini dan itu tidak berjalan. apakah itu akan berjalan secara otomatis hanya karena ada di /etc/init.d atau apakah saya perlu melakukan sesuatu di atas untuk menjadwalkannya agar berjalan ketika sistem dimulai?
amfibi
4
@amphibient Tidak cukup ... Anda juga perlu membuat symlink ke file ini (menggunakan lnperintah) ke direktori di dalamrc.d
meetamit
23
tidak ada direktori rc.d di folder root dll .. ini membuat saya tercengang bukankah ini direktori penting yang harus dijalankan Linux? Hanya saja hilang OS saya sepertinya berjalan baik. Apakah saya harus membuatnya? Saya melihat banyak file dengan nama yang sama seperti "rc1.d" sampai ke "rc5.d"
OKGimmeMoney
3
Saya belum punya /etc/rc.dfolder, tapi saya punya /etc/rcX.dfolder (Yaitu /etc/rc0.d , /etc/rc1.d , /etc/rcS.d ), juga ada file /etc/rc.local . Saya pikir Anda harus membuat symlink di folder khusus seperti /etc/rc9.datau di salah satu yang ada ... (Ubuntu Server 14.04)
F8ER
2
Pertanyaan ini membantu saya dengan ini: unix.stackexchange.com/questions/28679/…
seth10
344

Tetapkan crontab untuk ini

#crontab -e
@reboot  /home/user/test.sh

setelah setiap startup akan menjalankan skrip uji.

Hemant kumar
sumber
4
Ini adalah satu-satunya solusi yang bekerja untuk saya tanpa repot! terima kasih
whoopididoo
20
Ini adalah solusi terbaik, @reboot sh $HOME/test.shdi crontab bahkan lebih bersih
user3667089
4
@ user3667089 sebenarnya, itu tidak berfungsi. Saya membuka terminal, masukkan "crontab -e", sebuah jendela muncul, di mana saya menulis di "@reboot sh /home/user/test.sh" tetapi tidak berjalan saat startup. Di mana saya melakukan itu salah?
MycrofD
1
@ user3667089 baris default yang biasa '# Edit file ini ke ...' dan kemudian baris yang saya tulis '@reboot sh /home/.../.sh'. Saya juga mencoba '@reboot / home /.../.sh' tanpa "sh" awal tetapi tidak ada hasil.
MycrofD
3
@MycrofD Anda crontab -lharus menunjukkan @reboot sh $HOME/test.shuntuk mengonfirmasi bahwa itu sebenarnya telah disetel.
user3667089
124

Pendekatan sederhana adalah menambahkan baris di /etc/rc.local:

/PATH/TO/MY_APP &

atau jika Anda ingin menjalankan perintah sebagai pengguna khusus:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(trailing ampersand latar belakang proses dan memungkinkan rc.local untuk melanjutkan mengeksekusi)

Jika Anda ingin skrip init lengkap, distro debian memiliki file templat, jadi:

cp /etc/init.d/skeleton /etc/init.d/your_app

dan sedikit beradaptasi.

Gilles Quenot
sumber
2
Terima kasih! Pendekatan ini ternyata bekerja paling baik dengan persyaratan sederhana. Saya cukup yakin saya TIDAK perlu menentukan pengguna, jika tidak ketika harus menghentikan aplikasi secara manual (dengan menjalankan stop_my_app) saya harus melakukannya dengan sudo, bukan? Juga, saya bertanya-tanya apa sebenarnya fungsi dari trailing ampersand (?).
meetamit
3
Pengguna bergantung pada aplikasi Anda. Tetapi jika tidak benar-benar diperlukan untuk dijalankan sebagai root, hindarilah. &jalankan proses di latar belakang
Gilles Quenot
2
sputnick, maaf, tapi saya harus menandai Koren sebagai jawaban yang diterima, terutama karena apa yang ditunjukkan oleh @ erikb85, tetapi juga karena pertanyaan awal saya menanyakan init.dcara melakukan sesuatu (jawaban Anda hanya solusi yang lebih sederhana bagi saya pada saat itu) . Posting ini mendapat banyak pandangan dan suara, jadi penting untuk tetap akurat.
meetamit
4
Tampaknya tidak disebutkan bahwa trailing ampers dan latar belakang proses dan memungkinkan rc.local untuk terus mengeksekusi.
mchicago
Terima kasih untuk ini! Habiskan beberapa jam terakhir membenturkan kepala ke dinding saat saya mencoba membuat layanan, tetapi tidak ada yang berhasil. Mencoba ini, bekerja seperti pesona!
Marko Grešak
35

Ini adalah cara saya melakukannya di Red Hat Linux sistem .

Masukkan skrip Anda /etc/init.d, yang dimiliki oleh root dan dapat dieksekusi. Di bagian atas skrip, Anda dapat memberikan arahan untukchkconfig . Contoh, skrip berikut digunakan untuk memulai aplikasi Java sebagai oracle pengguna.

Nama skripnya adalah /etc/init.d/apex

#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
 'start')
   su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
 'stop')
   echo "put something to shutdown or kill the process here";;
esac

Ini mengatakan bahwa skrip harus dijalankan pada level 3, 4, dan 5, dan prioritas untuk start / stop adalah 99 dan 10.

Kemudian, sebagai pengguna rootyang dapat Anda gunakan chkconfiguntuk mengaktifkan atau menonaktifkan skrip saat startup:

chkconfig --list apex
chkconfig --add apex

Dan Anda bisa menggunakannya service start/stop apex.

Saule
sumber
Sementara itu saya telah bereksperimen dengan paket yang disebut supervisord ( supervisord.org ) yang tersedia di repositori epel. Ini dapat digunakan untuk memulai program dan memonitornya, memulai kembali dari kegagalan.
Saule
Alih-alih mengetik: "chkconfig --add service_name" setelah meletakkan skrip ke folder /etc/init.d/ Anda dapat mengetik: "chkconfig service_name on"
Dragan Radevic
23

Masukkan cronmenggunakan sudo:

sudo crontab -e

Tambahkan perintah untuk dijalankan saat start up, dalam hal ini skrip:

@reboot sh /home/user/test.sh

Menyimpan:

Tekan ESC lalu: x untuk menyimpan dan keluar, atau tekan ESC lalu ZZ (itu bergeser + zz)

Tes Tes Uji :

  1. Jalankan skrip pengujian Anda tanpa cron untuk memastikan itu benar-benar berfungsi.

  2. Pastikan Anda menyimpan perintah Anda di cron, gunakan sudo crontab -e

  3. Boot ulang server untuk mengonfirmasi semuanya berfungsi sudo @reboot

pengguna3140639
sumber
Saya sangat suka ini. Terima kasih! Ps. jangan gunakan sudojika Anda ingin menjalankan perintah tertentu selama start-up dengan menggunakan pengguna saat ini.
bahaya89
Di mana informasi ini seharusnya disimpan? Tidak masuk /tmp??
Peter Mortensen
15

Cukup tambahkan garis ke crontab Anda ..

Pastikan file tersebut dapat dieksekusi:

chmod +x /path_to_you_file/your_file

Untuk mengedit file crontab:

crontab -e

Baris yang harus Anda tambahkan:

@reboot  /path_to_you_file/your_file

Sesederhana itu!

Luciano Ghilarducci
sumber
Ini tidak bekerja untuk saya, apa pun yang saya lewatkan? # uname -a Linux accton-xp70a0-26-a1 3.11.10-301.fc20.x86_64 #1 SMP Thu Dec 5 14:01:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
Ini bekerja untuk saya di CentOs 7. Bagi mereka yang memiliki masalah, saya perlu membuat skrip shell, membuatnya dapat dieksekusi (chmod + x file_name), dan memanggil skrip shell dari cron yang pada gilirannya memanggil node path_to_file / index.js
SeanOlson
11

Opsi lain adalah memiliki perintah @reboot di crontab Anda.

Tidak semua versi cron mendukung ini, tetapi jika instance Anda didasarkan pada Amazon Linux AMI, maka itu akan berfungsi.

chris
sumber
6

Kamu bisa melakukannya :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

kemudian gunakan perintah ini

update-rc.d start_my_app defaults 100

Silakan lihat halaman ini di Cyberciti .

IR PRO
sumber
1
Saya memiliki pengaturan barebone yang cantik, dibangun di atas yocto dan ini adalah satu-satunya cara untuk membuat naskah script saya berfungsi. Terima kasih.
Catalin Vasile
3

Buat executable Anda sendiri / init

Ini bukan yang Anda inginkan, tetapi menyenangkan!

Pilih saja file yang dapat dieksekusi sewenang-wenang, bahkan skrip shell , dan boot kernel dengan parameter baris perintah:

init=/path/to/myinit

Menjelang akhir boot, kernel Linux menjalankan executable userspace pertama di jalur yang diberikan.

Beberapa proyek menyediakan populer init executable digunakan oleh distro besar, misalnya systemd, dan di sebagian besar distro init akan melakukan banyak proses yang digunakan dalam operasi sistem normal.

Tapi kita bisa membajak /init untuk menjalankan skrip minimal kita sendiri untuk lebih memahami sistem kita.

Berikut ini adalah pengaturan minimal yang dapat direproduksi: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
2

Solusi sederhana ini bekerja untuk saya di instance Amazon Linux yang menjalankan CentOS. Edit /etc/rc.d/rc.localfile Anda dan letakkan perintah di sana. Disebutkan dalam file ini bahwa itu akan dieksekusi setelah semua skrip init lainnya. Jadi berhati-hatilah dalam hal ini. Beginilah tampilan file untuk saya saat ini. masukkan deskripsi gambar di sini. Baris terakhir adalah nama skrip saya.

sst
sumber
1

Metode termudah mutlak jika semua yang ingin Anda jalankan adalah skrip sederhana, (atau apa pun) adalah jika Anda memiliki gui untuk menggunakan preferensi> sistem kemudian memulai aplikasi.

Cukup telusuri skrip yang Anda inginkan dan mulai lagi. (buat skrip dapat dieksekusi)

pemilik ladang
sumber
3
Ini sebenarnya tidak berjalan saat startup, tetapi saat login, yang merupakan perbedaan yang cukup besar. Ini juga tergantung pada pengaturan tertentu karena Anda tidak akan memiliki "System> Preferences" di setiap sistem (terutama bukan server).
jazzpi
istilah pencarian 'linux execute at startup' menuntun saya ke jawaban ini, yang saya cari. Meskipun tidak menjawab pertanyaan dari OP, ini mungkin membantu linux (ubuntu) noobs seperti saya, jadi itu layak mendapat upvote. Saya juga tidak suka, tapi itu pragmatisme.
thymaro
1

Untuk Debian 9 lihat /ubuntu/228304/how-do-i-run-a-script-at-start-up . Ini membantu saya. Versi singkat untuk Debian 9: tambahkan perintah (sebagai root) ke /etc/rc.local

/path_to_file/filename.sh ||  exit 1   # Added by me
exit 0

Mungkin, /path_to_file/filename.sh harus dapat dieksekusi (saya pikir begitu).

Mikhail Ionkin
sumber
1

Di Lubuntu saya harus menghadapi situasi yang berlawanan. Skype mulai berjalan setelah booting dan saya temukan di ~/.config/autostart/file skypeforlinux.desktop. Isi file adalah sebagai berikut:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

Menghapus file ini membantu saya.

aerijman
sumber
0
  • Tambahkan skrip Anda ke direktori /etc/init.d/
  • Perbarui level run rc Anda: di $ update-rc.d myScript.sh defaults NNmana NN adalah urutan yang harus dijalankan. 99 misalnya akan berarti akan dijalankan setelah 98 dan sebelum 100.
Kibrom Gebre
sumber
0

Bekerja dengan Python 3 microservices atau shell; menggunakan Ubuntu Server 18.04 (Bionic Beaver) atau Ubuntu 19.10 (Eoan Ermine) atau Ubuntu 18.10 (Cosmic Cuttlefish) Saya selalu suka langkah-langkah ini, dan selalu berhasil juga:

  1. Membuat microservice disebut p contoh "brain_microservice1.service" dalam kasus saya:

    $ nano /lib/systemd/system/brain_microservice1.service
  2. Di dalam layanan baru ini Anda berada:

    [Unit]
    Description=brain_microservice_1
    After=multi-user.target
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices    /microservice_1.py -k start -DFOREGROUND
    ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
    ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
    PrivateTmp=true
    LimitNOFILE=infinity
    KillMode=mixed
    Restart=on-failure
    RestartSec=5s
    
    [Install]
    WantedBy=multi-user.target
  3. Berikan izin:

    $ chmod -X /lib/systemd/system/brain_microservice*
    $ chmod -R 775 /lib/systemd/system/brain_microservice*
  4. Maka berikan izin eksekusi:

    $ systemctl daemon-reload
  5. Aktifkan kemudian, ini akan membuatnya selalu mulai saat startup

    $ systemctl enable brain_microservice1.service
  6. Maka Anda bisa mengujinya;

    $ sudo reboot sekarang

  7. Finish = SUKSES !!

Ini dapat dilakukan dengan skrip tubuh yang sama untuk menjalankan shell, bereaksi ... skrip startup basis data ... segala jenis kode os ... harap ini membantu Anda ...

...

Renan Moura
sumber
0

Inilah metode yang lebih sederhana!

Pertama: tulis skrip shell dan simpan .sh di sini adalah contohnya

#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";

skrip ini akan menonaktifkan keyboard internal saat startup.

Kedua: Buka aplikasi "Startup Application Preferences"

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Ketiga: klik Tambah. keempat: di bagian NAME beri nama. kelima: Di bagian perintah browse ke .sh Anda. keenam: edit bagian perintah Anda ke:

bash <space> path/to/file/<filename>.sh <space> --start

ketujuh: klik Tambah. Itu dia! Jadi!

Sekarang konfirmasikan dengan me-reboot komputer Anda.

Bersulang!

akbar ali
sumber
-1

Metode yang tidak menyakitkan, termudah dan paling universal hanya menjalankannya dengan ~.bash_profileatau ~.profile (jika Anda tidak memiliki file bash_profile) .

Cukup tambahkan perintah eksekusi di bagian bawah file itu dan itu akan dieksekusi ketika sistem dimulai.

Saya punya contoh di bawah ini; ~\Desktop\sound_fixer.sh

Juko
sumber
2
Itu tidak akurat. ~/.bash_profiledijalankan ketika pengguna log in - bukan ketika sistem boot. Dalam pertanyaan awal, tujuannya adalah menjalankan server aplikasi Node.js saat mesin mulai. Solusi Anda akan memerlukan pengguna manusia untuk masuk terlebih dahulu ke mesin sebelum server Node.js berjalan. Dan, jika beberapa jenis masalah menyebabkan server reboot dalam semalam, aplikasi tidak akan hidup kembali sampai manusia masuk kembali.
meetamit
-6

Bagi sebagian orang, ini akan berhasil:

Anda bisa menambahkan perintah berikut ke dalam SystemPreferencesStartup Applications :

bash /full/path/to/your/script.sh
Simpanlah
sumber
Saya tidak melihat ini di menu preferensi sistem. Tapi saya melihatnya ketika saya mencari di peluncur aplikasi.
OKGimmeMoney
Ini sebenarnya tidak berjalan saat startup, tetapi saat login, yang merupakan perbedaan yang cukup besar. Ini juga tergantung pada pengaturan tertentu karena Anda tidak akan memiliki "System> Preferences" di setiap sistem (terutama bukan server).
jazzpi
3
Jawaban ini tampaknya lebih untuk desktop Ubuntu / Linux, tetapi pengguna sebenarnya meminta bantuan untuk instance Linux AWS EC2, yang sejauh yang saya tahu, tidak memiliki GUI.
Vini.g.fer