Làm thế nào để khởi động nhiều tập lệnh shell khi khởi động


3

Tôi có sáu tập lệnh shell tôi bắt đầu khi tôi đăng nhập. Các tập lệnh shell khởi động các tập lệnh Python đi ra và quét các thứ khác nhau từ mạng như tiêu đề tin tức, thông tin thời tiết, v.v., mà tôi thêm vào máy tính để bàn của mình thông qua conky.

Vấn đề là bắt đầu tất cả các kịch bản shell này mỗi lần là một nỗi đau thực sự.

Tôi đã tìm kiếm và thử một số thứ nhưng dường như không có gì để làm việc.

Ai đó ở đây có thể làm sáng tỏ về cách tốt nhất để làm điều này xin vui lòng. Bằng cách này, tôi không thể kết hợp các tập lệnh shell trong một tệp vì tất cả chúng đều 'ngủ' trong một khoảng thời gian khác sau khi lệnh ban đầu được áp dụng.

Cảm ơn.

- Chỉnh sửa (thêm các ý kiến ​​sau) -

Tất cả các tập lệnh có định dạng sau:

#!/bin/bash

while true; do
    python /home/scott/debkaget.py > /home/scott/debka.txt
    sleep 120
done

Điều đó có thể được thêm vào hồ sơ? Tôi cần khía cạnh giấc ngủ cho nó. Tôi đang chạy KDE 4.9.

bash 

1
Bạn có sử dụng một trình quản lý cửa sổ? Cái nào?
choroba

"Nỗi đau" là gì?
New Alexandria

Vâng, nỗi đau là phải mở một thiết bị đầu cuối, gõ 'runshell1.sh', ctrl-t, và làm điều này nhiều lần. Và danh sách kịch bản shell của tôi tiếp tục phát triển, 7 giờ. :(

Tôi nghĩ bạn nên lấy 2 phần câu trả lời của tôi và áp dụng nó vào các vị trí mà NormanRamsey chỉ ra.
New Alexandria

Tôi cũng tò mò về một ví dụ rõ ràng - vì vậy tôi quyết định xây dựng nó. Có lẽ tôi sẽ sử dụng nó lần sau.
New Alexandria

Câu trả lời:


4

Nếu bạn "thêm vào máy tính để bàn", bạn có trình quản lý cửa sổ đang chạy và nếu bạn đang sử dụng bash thì có lẽ là Linux. Trong trường hợp đó, có lẽ bạn tốt nhất nên khởi chạy các tập lệnh của mình vào nền từ tệp Xsession, ~/.Xsessionhoặc /etc/X11/Xsessionhoặc một biến thể. Để biết thêm thông tin hãy thử

man 5 Xsession
man 1 xinit

Trong khi tôi và Leffler trình bày câu trả lời cho mục đích chung, câu trả lời này có thông tin cụ thể nhất về tên miền.
New Alexandria

3

Một khả năng là thêm các yêu cầu thích hợp vào tệp .bash_profilehoặc .profiletệp của bạn . Khi bạn chạy chúng một cách thủ công, bạn có thêm một &ở cuối để chạy chúng trong nền không? Nếu vậy, làm điều đó trong hồ sơ của bạn quá.

Vấn đề chính ở đây là 'chuyện gì xảy ra nếu bạn đã chạy shell đăng nhập'. 6 tập lệnh có hoạt động hoàn toàn nếu có một bản sao khác đang chạy không? Họ có bận tâm để phát hiện rằng có một bản sao khác đang chạy.

Nếu bạn đang đăng nhập tại máy tính để bàn GUI, thì có nhiều cách để chạy chương trình khi máy tính để bàn khởi động; sử dụng nó để chạy các tập lệnh mà bạn đang cố gắng xử lý. Để có hướng dẫn chính xác hơn (từ người khác), hãy cung cấp thêm thông tin về môi trường của bạn.


Hi, cảm ơn bạn đã trả lời. Để bắt đầu, tôi đang chạy KDE 4.9, gần đây đã chuyển sang cái này từ Ubuntu 12.04. Tôi đã làm điều tương tự trên Ubuntu mặc dù.

Hãy nhìn vào gợi ý Xsession của ông Ramsey.
Jonathan Leffler

2

Bạn có thể sử dụng chiến lược cơ bản này:

  • có tập lệnh bắt đầu bằng cách tạo tập tin pid như script_name.pid. Làm cho các tập lệnh hủy bỏ nếu tồn tại tập tin pid của chúng
  • có các kịch bản chạy trong nền

Khi bạn gọi từ .bash_profile (hoặc tương tự) thì các tệp pid sẽ ngăn .bashrc kết thúc nhiều quy trình hơn cho mỗi trình bao mới.

Theo NormanRamsey, bạn sẽ thêm vào XSession (hoặc trình quản lý cửa sổ khác):

# Web Scrapers
runshell_yahoonews.sh
runshell_blog_disney.sh
runshell_stackoverflow_election.sh
runshell_twitter_dad.sh
runshell_twitter_origamistork.sh
runshell_blog_daringfireball.sh

Xem xét việc viết các hàm bash . Bạn có thể có một tập tinlib_scrapers.sh

#!/bin/bash 
pid_path = "~/.X-scrapers/"
suff = '.pid'

function pidfile_create(invoker) {
  if [ ! -e $pid_path$invoker$suff ];
  then
    # make it
    echo $$ > $invoker$suff
  else
    # alert it existance
    cat $pid_path$invoker$suff
  fi
}
function pidfile_destroy(invoker) {
  rm $pid_path$invoker$suff
  if [ -e $pid_path$invoker$suff ];
  then
    echo "$pid_path$invoker$suff could not be destroyed properly"
  fi
}

sau đó trên dòng 2 của mỗi người dọn dẹp của bạn (ví dụ runshell_yahoonews.sh). Điều này sẽ ngăn tập lệnh thực thi nếu một bộ cạp đang chạy.

lib_scrapers.sh

if [ pidfile_create($0) ]
then
  exit
fi

ở cuối mỗi cái cạp, đặt

pidfile_destroy($0)

Bạn có thể có sự đánh đổi khác, nhưng điều này nghe có vẻ hợp lý cho những gì bạn mô tả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.