Menjalankan beberapa perintah nohup di latar belakang

12

Mendapat dua perintah cmd1 dan cmd2. Dari keduanya, cmd2 membutuhkan waktu lebih lama untuk selesai. Perlu menjalankan cmd2 dan kemudian cmd1.

Mencoba menjalankannya dengan cara berikut:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

atau

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

Tetapi kedua waktu saya dapat melihat cmd1 tidak menunggu cmd2 selesai dan result1 terisi.

Bagaimana membuat cmd1 dijalankan setelah cmd2 ketika keduanya harus proses nohup dan dijalankan di latar belakang?

pengguna33767
sumber
Pertanyaan ini sudah ditanyakan unix.stackexchange.com/questions/67006/…
Rahul Patil
2
Pertanyaan di unix.stackexchange.com/questions/67006/… sedikit berbeda karena saya ingin mempertahankan urutan eksekusi saya. Harap perbaiki saya jika saya salah dalam memahami pertanyaan lainnya.
user33767

Jawaban:

12

Anda membuat keduanya cmd1dan cmd2berjalan secara paralel. Anda berkata: "Mulai cmd2 di latar belakang dan putuskan hubungan apa pun dengannya. Mulai cmd1 di latar belakang dan putuskan hubungan apa pun dengannya. ” Maksud Anda: “Mulai cmd2 di latar belakang; ketika sudah selesai, mulai cmd1 (juga di latar belakang). " Karena tidak ada lagi hubungan dengan tugas latar belakang, Anda perlu menyusun tugas latar belakang yang melakukan cmd2 lalu cmd1. Ini cmd2; cmd1(atau lebih tepatnya cmd2 && cmd1menjalankan cmd1 hanya jika cmd2 berhasil), dan Anda harus memberitahu nohupuntuk memulai shell yang berjalan di latar belakang untuk itu.

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih. Ini bekerja dengan baik. Ya, itulah yang saya pikirkan, setelah membuat cmd pertama pergi ke latar belakang, itu tidak mempengaruhi perintah kedua, yang dimulai walaupun saya ingin menunggu perintah pertama selesai. Saya perlu membaca manual tentang mengirim perintah ke latar belakang.
user33767
3

Jika Anda tidak keberatan tidak menggunakan nohup:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown
artyom
sumber
Akan memeriksanya. Tetapi saat ini akan pergi dengan jawaban dari Giles di mana perintah dibungkus dengan sh. Terima kasih
user33767
Ini ide yang buruk. Ketika pengguna keluar dari konsol, itu akan mematikan sesi.
mootmoot
@mootmoot ini berfungsi sebagaimana mestinya, periksa sendiri? perintah tidak akan menerima SIGHUP ketika shell induk keluar.
artyom
Ya, aman untuk shell jika Anda menjalankan perintah menggunakan crond / crontab. Tapi itu tidak aman pty / xterm / ssh. unix.stackexchange.com/questions/3886/…
mootmoot
2

Cukup gunakan:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &
Rahul Patil
sumber
Saat menjalankan beberapa perintah baik-baik saja, saya ingin mempertahankan urutan eksekusi yang tepat yaitu cmd2 pertama dan kemudian cmd1 dan itu tidak terjadi dengan perintah di atas. terima kasih
user33767
0

beri tahu kami apa yang sebenarnya Anda lakukan dengan cmd2 dan cmd1. Itu tergantung pada jenis tugas dan output yang Anda inginkan dari perintah Anda. Jika Anda menghadapi masalah dengan menekan dua kali masukkan kunci dengan perintah maka bisa dipecahkan oleh posting saya ini

Anda bisa pergi dengan cara ini juga

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

Lihat screenshot yang diberikan di bawah ini, Di sini saya menggunakan 3 perintah dan semua menjalankan satu per satu secara berurutan. Saya menggunakan backticks untuk tugas ini. Dalam tangkapan layar, Anda juga dapat mengamati cap waktu tanggal. perintah sleep memiliki 60 detik, maka setelah 60 detik perintah saya berikutnya berhasil dijalankan. Saya menggunakan perintah pekerjaan untuk memeriksa apakah ada perintah yang masih berjalan di latar belakang. Di sini tidak. pekerjaan yang bisa Anda lihat adalah 1.

nohup-multiple-command

Tangkapan layar ini juga tersedia di tautan ini , jika tidak terlihat

Sharad Chhetri
sumber