bagaimana cara mengeksekusi perintah setelah menjalankan perintah saat ini di bash?

18

Saya mengunduh file dengan wget, dan saya ingin mematikan komputer saya setelah pengunduhan akan selesai, tetapi saya harus pergi ke suatu tempat sekarang :) Apakah mungkin untuk menjalankan perintah di bash secara tepat ketika proses akan selesai?

Saya tahu ini bekerja:

wget http://example.com/file.rar; shutdown sekarang

Tetapi bagaimana jika saya mengetik saja:

wget http://example.com/file.rar
inothemo
sumber
2
Pertimbangkan menggunakan && dan || dari pada ;. && dan || periksa nilai pengembalian dari perintah sebelumnya sebelum menjalankan perintah berikutnya ... kalau-kalau wget gagal, Anda mungkin tidak ingin mematikan.
KFro

Jawaban:

31

Anda dapat melakukan sesuatu seperti ini:

  1. hentikan eksekusi wget dengan ctrl-z (tidak dihentikan, ditangguhkan)
  2. letakkan di latar belakang (bg)
  3. jalankan: tunggu; shutdown -h sekarang

tunggu akan menunggu semua program berjalan di latar belakang dari shell saat ini - yaitu wget ini.

Setelah menunggu akan selesai - shutdown akan berlangsung.


sumber
jangan lupa untuk foreground (fg) instance wget Anda ketika selesai. Jika wget sudah berjalan, Anda dapat meletakkannya di latar depan dengan ^ z (control-z).
Andrew Scagnelli
4
Tidak perlu kecuali Anda benar-benar ingin melihat bilah kemajuan.
dmckee
Tidak perlu karena dia meninggalkan mesin untuk dirinya sendiri dan kemudian mati.
Wolf,
11

Di shell lain, gunakan

ps -u <your username> | grep wget

untuk menemukan PID dari perintah yang ingin Anda tunggu, lalu

wait <PID>; shutdown -h now

sehingga shutdown tidak akan berjalan sampai proses dihentikan. Lihat juga jawaban depesz .

dmckee
sumber
+1, hanya sebuah catatan: waithanya akan berfungsi untuk perintah yang dimulai dari shell yang sama
Chriki
4

Solusi saya adalah ini: tunda tugas Anda yang sudah berjalan lama dengan Control + Z, lalu ketik sesuatu seperti:

fg; echo "Done!"

Jika Anda ingin menjalankan reaksi secara berbeda berdasarkan keberhasilan atau kegagalan perintah Anda, gunakan && dan || sebagai operator hubungan arus pendek.

fg && echo "Success!" || echo "Failure!"

EDIT: Ini tidak akan berfungsi dengan sudo, karena akan meminta kata sandi Anda. Oleh karena itu, saya telah menghapus contoh menggunakan sudo. Jika Anda memerlukan sudo untuk tugas kedua, gunakan metode lain yang diposting di sini.

Di sisi lain, saya percaya bahwa GNOME dan KDE menawarkan cara untuk memicu shutdown / reboot tanpa menggunakan sudo, dengan mengirimkan sinyal D-Bus yang sesuai atau sesuatu.

Ryan C. Thompson
sumber
+1 untuk fg..., tetapi sudobisa menjadi masalah jika meminta Anda untuk kata sandi
mark4o
Hmm. Ya, saya belum pernah menggunakan trik ini untuk mengatur sudoing ketika sesuatu selesai. Untuk sudo, Anda perlu trik yang berbeda. Saya akan mengedit posting saya sesuai.
Ryan C. Thompson
Untuk tujuan saya, jawaban ini lebih unggul karena menempatkan proses secara otomatis kembali ke latar depan
Cookie
Juga, kata sandi untuk sudo dapat dinonaktifkan (per pengguna dan per perintah) - jika pengguna diizinkan untuk mematikan melalui sudo ini sekali, ia mungkin diizinkan untuk selalu melakukannya. Shutdown yang bermusuhan mungkin tidak begitu berbahaya dalam beberapa kasus - tentu saja tidak berbahaya seperti akses tamu yang dikompromikan pada mesin yang sedang berjalan.
Kue
1

Ya, ketikkan saja perintah kedua Anda dan tekan enter. Jika program Anda saat ini menggulirkan teks, Anda tidak dapat melihat apa yang Anda ketikkan dengan benar, jadi perhatikan kunci Anda sehingga Anda melakukannya dengan benar.

Cara yang lebih cerdas adalah beralih ke TTY lain (CTRL + ALT + F1 hingga F6) dan menjalankan perintah secara bersamaan, atau jika Anda menggunakan program baris perintah seperti layar, Anda dapat membuat jendela baru di dalamnya.

Tamara Wijsman
sumber
+1 untuk opsi pertama. Saya khawatir saya tidak mengerti bagaimana pilihan kedua seharusnya bekerja.
innaM
Menekan misalnya CTRL + ALT + F2 akan mengalihkan Anda ke konsol kedua yang baru di mana Anda dapat masuk dan mengetik perintah, dengan cara ini Anda dapat menjalankan perintah kedua di sana. Kedua, jika Anda mengunduh layar (program untuk menggunakan konsol Anda dengan cara yang lebih mewah), Anda dapat membuka tab / jendela kedua di mana Anda dapat mengetik lagi perintah, tanpa harus masuk lagi. Tetapi karena Anda membutuhkannya secara bersamaan, Anda dapat tetap menggunakan opsi 1, saya tidak berpikir ada cara lain untuk mencapai efek yang sama. Kecuali Anda menggunakan TTY / jendela lain untuk memeriksa skrip jika prosesnya masih berjalan. :-P
Tamara Wijsman
Gunakan tunggu PID dari jawaban dmckee
Cookie
1

Jika Anda ingin berkhayal, periksa status pengembalian wget dan hanya pematian jika berhasil.

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi
Doug Harris
sumber
2
Ini adalah pendekatan yang baik ketika membuat skrip, tetapi saat wgetdijalankan Anda tidak mendapatkan konfirmasi kembali untuk membuat tes.
dmckee
Anda dapat menggabungkan ini dengan Control-Z dan trik fg saya untuk menyiasatinya.
Ryan C. Thompson