Bagaimana cara mendapatkan pid dari perintah yang dieksekusi terakhir dalam skrip shell?

254

Saya ingin memiliki skrip shell seperti ini:

my-app &
echo $my-app-pid

Tapi saya tidak tahu bagaimana cara mendapatkan pid dari perintah yang baru saja dieksekusi.

Saya tahu saya bisa menggunakan jobs -p my-appperintah untuk menangkap pid. Tetapi jika saya ingin menjalankan shell beberapa kali, metode ini tidak akan berfungsi. Karena jobspec bersifat ambigu.

David S.
sumber

Jawaban:

338

PID dari perintah yang dieksekusi terakhir ada dalam $!variabel shell:

my-app &
echo $!
enzotib
sumber
1
Ini mencetak pid seperti misalnya. [1] 893. Saya hanya ingin nomor.
user3153014
33
Perlu dicatat bahwa ini adalah singkatan dari program yang dimulai di latar belakang . Jika tidak ada proses latar belakang yang telah dimulai, parameter tidak diatur.
ramrunner
5
Solusi lain yang layak disarankan dalam (komentar untuk jawaban) Bagaimana mendapatkan pid dari proses yang baru dimulai : oh, dan "oneliner": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &- sysfault 24 Nov '10 jam 14:28
imz - Ivan Zakharyaschev
14
@ user3153014 String s seperti "[2] 2625" dicetak oleh shell setelah memulai tugas latar belakang. Ini tidak terkait dengan output dariecho $!
Petr Gladkikh
Saya biasanya menggunakan kode seperti itu dalam skrip ketika saya harus menunggu sampai proses berakhir. my-app & myVar=$! ; fg. fgmembawa proses ke latar depan lagi. Saya kemudian dapat mencetak echo $myVarnanti dan saya cukup yakin bahwa aplikasi saya sudah selesai.
Vrata Blazek
66

Dapatkan PID:

#!/bin/bash
my-app &
echo $!

Simpan PIDdalam variabel:

#!/bin/bash
my-app &
export APP_PID=$!

Simpan semua contoh PIDdalam file teks:

#!/bin/bash
my-app &
echo $! >>/tmp/my-app.pid

Simpan output, kesalahan, dan PIDdalam file terpisah:

#!/bin/bash
my-app >/tmp/my-app.log 2>/tmp/my-app.error.log &
echo $! >>/tmp/my-app.pid

echo "my-app PID's: $(cat /tmp/my-app.pid)"
Eduardo Cuomo
sumber
3
Pertanyaannya tidak bertanya tentang pengalihan, maka jawaban Anda sebagian besar sama dengan yang diterima kecuali bahwa jika instance my-appselesai, dan mungkin lebih buruk PID-nya akan digunakan kembali nanti, Anda akan memiliki informasi buruk di file Anda. Saya kira jawaban ini tidak banyak menambah nilai pada jawaban yang diterima yang ada
Eric Renouf
@EricRenouf posting diperbarui!
Eduardo Cuomo
turunan lain yang mungkin berguna. Ini mendapatkan PID dan pada saat yang sama memperlakukannya sebagai proses latar depan (kebanyakan): sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
mlathe
bukankah APP = main &cara untuk mengambil PID?
MrMesees
3

Coba sesuatu seperti

pidof my_app >> /tmp/my_app.pid
Piyush Jain
sumber
1
perintah eksternal, dan lambat, jika sistem dapat memberikan PID secara langsung mengapa mencari melalui semua proses untuk menemukan hal itu? dan juga, tidak bisa memastikan Anda akan mendapatkan nilai yang benar
papo
-4

Coba sesuatu seperti ini:

 ps ef | grep "[m]y-app" | awk '{print $2}'

Menempatkan huruf pertama dari proses Anda antara [ ]memastikan Anda tidak mendapatkan grepproses dalam daftar Anda. Jika perlu Anda juga dapat menambahkan grep pada nama pengguna Anda.

Goez
sumber
9
Itu sangat rapuh dan tidak berfungsi jika my-appdijalankan lebih dari sekali - davidshen84 secara khusus khawatir tentang kasus itu.
Mat
2
Jika Anda memilih rute ini, Anda harus menggunakannya pgrep.
Willem