Perintah shell asinkron

100

Saya mencoba menggunakan skrip shell untuk memulai perintah. Saya tidak peduli jika / kapan / bagaimana / mengapa itu selesai. Saya ingin prosesnya dimulai dan dijalankan, tetapi saya ingin segera dapat kembali ke cangkang saya ...

LorenVS
sumber
2
Terkait, lihat Perbedaan antara nohup, disown dan & di Unix dan Linux Stack Exchange.
jww
1
Bagi mereka yang mencari jawaban yang lebih mendalam yang berbicara tentang perbedaan antara nohup, &dandisown , klik di sini untuk menggulir ke jawaban keempat .
noɥʇʎԀʎzɐɹƆ

Jawaban:

116

Anda bisa menjalankan skrip di latar belakang:

$ myscript &

Perhatikan bahwa ini berbeda dengan memasukkan bagian &dalam skrip Anda, yang mungkin tidak akan melakukan apa yang Anda inginkan.

Carl Norum
sumber
1
Saya tahu ini akan menjadi sesuatu yang mudah, terima kasih banyak ... Linux bukan milik saya, tapi saya mencoba untuk mempercepat ... Btw, apakah ini akan berhasil jika dikombinasikan dengan nohup?
LorenVS
2
Apa perbedaan antara meletakkan & di baris perintah dan memasukkannya ke dalam skrip? Saya tidak menyadari bahwa mereka berbeda.
Jacob Sharf
8
@JacobSharf, cobalah dan Anda akan melihatnya. Jika &ada di dalam skrip dan Anda tidak memiliki wait, perintah latar belakang akan dimatikan saat skrip keluar.
Carl Norum
oh. Itu sangat menjelaskan. Saya baru-baru ini memperhatikan beberapa efek yang akan disebabkan oleh itu. Googling itu benar-benar membawa saya ke halaman ini. Terima kasih
Jacob Sharf
Jika myscriptmemodifikasi lingkungan terminal, mis. ini adalah perintah inisialisasi terminal yang tidak diperlukan segera dan dapat ditunda, apakah masih akan mengubah lingkungan terminal?
noɥʇʎԀʎzɐɹƆ
58

Semua orang lupa disown. Jadi inilah ringkasannya:

  • & menempatkan pekerjaan di latar belakang.

    • Membuatnya memblokir saat mencoba membaca masukan, dan
    • Membuat cangkang tidak menunggu sampai selesai.
  • disown menghapus proses dari kontrol pekerjaan shell, tetapi tetap membiarkannya terhubung ke terminal.

    • Salah satu akibatnya adalah bahwa shell tidak akan mengirimkannya SIGHUP(Jika shell menerima SIGHUP, ia juga mengirimkan a SIGHUPke proses, yang biasanya menyebabkan proses dihentikan).
    • Dan jelas, ini hanya dapat diterapkan ke pekerjaan latar belakang (karena Anda tidak dapat memasukkannya saat pekerjaan latar depan sedang berjalan).
  • nohupmemutus proses dari terminal, mengalihkan output ke nohup.outdan melindunginya dari SIGHUP.

    • Proses tidak akan menerima kiriman apa pun SIGHUP.
    • Ini benar-benar independen dari kontrol pekerjaan dan pada prinsipnya dapat digunakan juga untuk pekerjaan latar depan (meskipun itu tidak terlalu berguna).
    • Biasanya digunakan dengan &(sebagai pekerjaan latar belakang).
Ani Menon
sumber
Saya tidak dapat menemukannya disowndi Debian atau OS X. Saya pikir itu adalah sebuah program, tapi sepertinya saya salah. Apa itu?
jww
disown command dan di OSX
Ani Menon
6
Ini jawaban terbaik. Paling komprehensif.
noɥʇʎԀʎzɐɹƆ
3
Pasti jawaban terbaik, tidak tahu mengapa begitu sedikit up
HeberLZ
1
@VladGanshin No.
Ani Menon
39
nohup cmd

tidak menutup saat Anda menutup terminal. keluaran secara default pergi ke nohup.out

Anda dapat menggabungkan ini dengan latar belakang,

nohup cmd &

dan singkirkan hasilnya,

nohup cmd > /dev/null 2>&1 &

Anda juga bisa disownmendapatkan perintah. ketik cmd, Ctrl-Z, bg,disown

Steve B.
sumber
2
Keren, gila bagaimana semuanya digabungkan, saya pikir pemesanan akan sampai pada saya pada awalnya, tetapi saya kira Anda bisa menghafalnya (apa yang Anda tulis atau "nohup cmd &> / dev / null 2> & 1" :))
LorenVS
Saya tersandung pada malam ini. Saya telah berjuang dengan skrip shell selama 2 hari dan saran ini berhasil. Terima kasih banyak
JD Long
Luar biasa, ini sangat berguna. Saat berjalan dalam mode latar belakang, Anda dapat memeriksa keluaran perintah sesekali saat menggunakan tail nohup.out, ini akan menampilkan 10 baris terakhir dari keluaran perintah. Saya menggunakan ini untuk pekerjaan cadangan rsync untuk melihat file apa itu saat ini.
Martin Hansen
Bagaimana jika saya melakukan ini, tetapi ingin menghentikan proses latar belakang?
Stephan Bijzitter
Shell mencetak pengidentifikasi pekerjaan saat Anda memulai pekerjaan dengan tepat untuk tujuan ini. Anda dapat melihat pekerjaan Anda yang sedang berjalan kapan saja dengan jobs.
tripleee
26

Sebagai alternatif, setelah Anda menjalankan program, Anda dapat menekan Ctrl-Z yang menghentikan program Anda dan kemudian mengetik

bg

yang menempatkan program yang terakhir Anda hentikan di latar belakang. (Berguna jika Anda memulai sesuatu tanpa '&' dan masih menginginkannya di backgroung tanpa memulai ulang)

pajton
sumber
2
Terima kasih, itu trik kecil yang keren ... Mulai benar-benar menghargai beberapa kebaikan cangkang ...
LorenVS
3

screen -m -d $command$memulai perintah dalam sesi terpisah. Anda dapat menggunakan screen -runtuk melampirkan ke sesi yang dimulai. Ini adalah alat yang luar biasa, sangat berguna juga untuk sesi jarak jauh. Baca lebih lanjut di man screen.

mluthra.dll
sumber
@LadenkovVladislav Saya 95% yakin Anda dapat menginstal layar di RedHat. Saya punya di CentOS.
BuvinJ
Di Ubuntu, saya ingin meniru perintah "start" Windows / batch. Yaitu meluncurkan program latar depan (gui) secara asinkron, dan melanjutkan melalui skrip shell. Ini persis seperti itu.
BuvinJ