Menjalankan proses-id dari perintah diluncurkan dengan "su -c"

9

Saya menjalankan program java di dalam shell dan menulis id proses ke file teks. Jadi ketika saya melakukan ini:

nohup java app.Main > /dev/null 2>&1 &
echo $! > /var/run/app.pid

Berhasil. Tapi saya benar-benar ingin menjalankannya sebagai pengguna lain

su - appuser -c "nohup java app.Main > /dev/null 2>&1 &"
echo $! > /var/run/app.pid

Ini tidak berhasil. Apakah ada cara untuk mendapatkan proses-id dari perintah yang diluncurkan dengan opsi -c?

Prasanth
sumber

Jawaban:

8

Anda dapat melakukan:

su - appuser -c 'nohup java app.Main > /dev/null 2>&1 &
                 echo "$!"' > /var/run/app.pid

(yang mengasumsikan shell login appusermirip Bourne).

su -me-reset lingkungan, jadi jika Anda ingin agar variabel diperluas di baris perintah, itu harus dilakukan oleh shell Anda (bukan shell login dari pengguna jarak jauh) seperti:

su - appuser -c "nohup '$JAVA_BIN' '$JAVA_CLASS' > /dev/null 2>&1 &"'
                 echo "$!"' > /var/run/app.pid

(yang menganggap variabel-variabel itu tidak mengandung karakter kutipan tunggal).

Anda ingin pengalihan dilakukan oleh shell Anda (running as root), bukan appusershell (yang mungkin tidak memiliki izin tertulis untuk /var/run).

Stéphane Chazelas
sumber
2
Terima kasih. Itu berhasil, tetapi saya harus sedikit men-tweak untuk kasus saya. Untuk beberapa alasan, saya harus menambahkan garis miring terbalik sebelum $! dan kemudian saya harus pipa ke file tmp karena masalah izin. Baris berikutnya akan membacanya dari file tmp dan meletakkannya di lokasi yang tepat. su - appuser -c "nohup $JAVA_BIN $JAVA_CLASS > /dev/null 2>&1 & echo \$! > /tmp/appid.tmp"
Prasanth
@Rasanth, lihat edit saya.
Stéphane Chazelas