GNU/Linux >> Belajar Linux >  >> Linux

Proses Dalam Sesi Dalam Shell Interaktif Vs Dalam Skrip?

Jika saya menjalankan perintah ini dalam skrip, itu tidak menghasilkan output kecuali header dari ps :

 # Taken from Advanced Bash Usage on youtube:

 echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"

Ini adalah outputnya:

$./testing.bash
  PID TTY      STAT   TIME COMMAND

tapi di sini dijalankan di terminal yang menghasilkan keluaran yang diharapkan :

$echo "$(echo "$(echo "$(echo "$(ps wwf -s $$)")")")"
  PID TTY      STAT   TIME COMMAND
18289 pts/4    Ss+    0:00 /bin/bash
17917 pts/4    S+     0:00  \_ /bin/bash
17918 pts/4    S+     0:00      \_ /bin/bash
17919 pts/4    S+     0:00          \_ /bin/bash
17920 pts/4    S+     0:00              \_ /bin/bash
17921 pts/4    R+     0:00                  \_ ps wwf -s 18289

PERTANYAAN:

Dapatkah Anda menjelaskan perbedaannya dan menunjukkan cara yang tepat untuk melakukannya?

Saya telah mencoba banyak hal dan mencari di Google selama 4 jam, jika Anda perlu, saya dapat mencantumkan apa yang saya coba tetapi menurut saya itu tidak relevan di sini.

$echo $SHELL
/bin/bash

dan:

$head -1 testing.bash 
#!/bin/bash

Jawaban yang Diterima:

ps-s sessionid pilihannya adalah memilih proses berdasarkan id sesinya.

Anda dapat menggunakan ps -j untuk melihat id sesi proses. Sesi bersama dengan grup proses umumnya digunakan untuk kontrol pekerjaan shell (karenanya -j ).

Emulator terminal Anda membuat sesi baru dengan proses yang kemudian digunakan kembali untuk menjalankan shell pilihan Anda. Jadi, di terminal, id sesi umumnya akan sama dengan pid shell itu.

Jadi, jika Anda menjalankan ps -j -s "$$" di itu shell, Anda akan mendapatkan proses dalam sesi karena "$$" terjadi sama dengan id sesi.

Jika Anda menjalankan perintah itu di shell lain (seperti shell yang dieksekusi dalam proses anak untuk menafsirkan testing Anda script), shell apa pun yang bukan pemimpin sesi, Anda tidak akan mendapatkan apa-apa karena tidak ada sesi dengan id yang sesuai dengan pid shell itu.

$ ps -j -s "$$"
  PID  PGID   SID TTY          TIME CMD
 7239  7239  7239 pts/7    00:00:00 zsh
21002 21002  7239 pts/7    00:00:00 ps

$$ adalah 7239, pemimpin sesi. Sehingga ps -j -s 7239 memberi saya semua proses dalam sesi itu.

$ sh -xc 'ps -j -s "$$"; ps -j -p "$$"'
+ ps -j -s 21044
  PID  PGID   SID TTY          TIME CMD
+ ps -j -p 21044
  PID  PGID   SID TTY          TIME CMD
21044 21044  7239 pts/7    00:00:00 sh

ps pertama perintah tidak mengembalikan apa pun karena, sebagai ps second kedua menunjukkan, tidak ada sesi dengan id 21044 karena proses id 21044 bukan pemimpin sesi. Pemimpin sesi masih 7239, shell dimulai oleh emulator terminal.

$ sh -xc 'ps -j -s "$(($(ps -o sid= -p "$$")))"'
+ ps -o sid= -p 21215
+ ps -j -s 7239
  PID  PGID   SID TTY          TIME CMD
 7239  7239  7239 pts/7    00:00:00 zsh
21215 21215  7239 pts/7    00:00:00 sh
21217 21215  7239 pts/7    00:00:00 ps

Sekarang, kita melihat semua proses dalam sesi. Kami menggunakan ps -o sid= -p "$$" untuk mendapatkan id sesi yang $$ milik.

Terkait:Uji apakah ada file yang cocok dengan pola untuk menjalankan skrip?
Linux
  1. Tentukan Shell In Script Selama Runtime?

  2. Waktu Habis Dalam Skrip Shell?

  3. Bagaimana Cara Memeriksa Apakah Shell Masuk/interaktif/batch?

  1. Menentukan Jalur Ke Skrip Shell Bersumber?

  2. Bagaimana Menangani Switch Dalam Script Shell?

  3. Arti dari $? Dalam Skrip Shell?

  1. Menjalankan skrip shell secara paralel

  2. Skrip Bash:Menggunakan perintah skrip dari skrip bash untuk mencatat sesi

  3. Direktori skrip Shell saat ini?