Thêm mục vào inittab trên OpenSuse 12.1


7

Tôi hiện đang làm việc trên một dự án cần được thêm vào để inittabchương trình tải trong khi khởi động.

Chương trình mà tôi đang cố gắng bắt đầu là ứng dụng ac # mono. Tôi đã tạo tập lệnh bắt đầu và nếu tập lệnh bắt đầu được chạy thủ công, chương trình sẽ khởi chạy tốt. Tuy nhiên, khi tôi đưa nó vào inittabchương trình không khởi chạy.

Tôi đã đăng ký /var/log/messagesnhưng không nói có gì sai, nó chỉ nói rằng nó đang tải lại.

Dưới đây là những gì tôi đã thêm vào inittabkịch bản của mình

bes:2345:respawn:/home/bits/MyProgram/start.myprogram

Cảm ơn vì bất kì sự giúp đỡ nào của bạn

CẬP NHẬT Dưới đây là mã trong tập lệnh bắt đầu được đặt trong / home / bits / MyProgram.

#!/bin/sh

cd /home/bits/MyProgram

/usr/bin/mono EmailServer.exe "$@"

Tôi cũng đã thử thêm> mylog.txt vào cuối dòng bắt đầu bằng / usr / bin / mono, vd

/ usr / bin / mono EmailServer.exe "$ @"> mylog.txt

Nếu tôi chạy tập lệnh bắt đầu một cách thủ công, ngay cả khi tôi không ở trong thư mục chứa tập lệnh bắt đầu thì nó vẫn hoạt động tốt, chỉ khi tôi thêm nó vào inittab và chạy telinit thì nó không bao giờ bắt đầu và nhật ký không được ghi vào nhưng nhật ký sẽ được ghi vào nếu tôi khởi động chương trình một cách thủ công.

Cảm ơn vì bất kì sự giúp đỡ nào của bạn.


Đủ tệ để bạn sử dụng mono trên hệ thống linux. Nhưng đặt nó vào inittab thì thật kinh khủng. Sử dụng tập lệnh /etc/init.d/ thích hợp.
Nils

Phân phối nào bạn đang sử dụng và ý nghĩa của tập lệnh inittab là gì?
Ulrich Dangel

@UlrichDangel Tôi đang sử dụng OpenSuse 12.1 và bởi inittab, ý tôi là / etc / inittab, đó là nơi bạn có thể thêm mọi thứ để tải lên khi khởi động.
Boardy

Câu trả lời:


4

Vấn đề rất đơn giản, bạn đang sử dụng OpenSuse 12.1 sử dụng systemd thay vì hệ thống khởi động System V cổ điển của bạn .

Để cài đặt một dịch vụ mới, hãy tạo tệp sau trong /etc/systemd/system/myprogname.service

[Unit]
Description=My progname service file

[Service]
ExecStart=/home/bits/MyProgram

[Install]
WantedBy=multi-user.target

Sau khi chạy systemctl daemon-reloadsystemctl start myprogname.service

Nếu bạn muốn tự động khởi động lại MyProgname, bạn phải thêm

Restart=restart-always

đến phần dịch vụ.


Cảm ơn sự giúp đỡ của bạn, điều này đã khiến tôi phát điên, điều này sẽ rất ẩn so với việc sử dụng inittab
Boardy

6

Đặt chương trình của bạn ở đâu đó.

Sao chép và chỉnh sửa tệp khung xương để kiểm soát công việc init được tìm thấy tại /etc/init.d/sk MP .

Sửa đổi tệp này để chỉ ra WHICH runlevel bạn muốn ... trong ví dụ của bạn, bạn muốn 2,3,4,5, có các tùy chọn ở đầu tệp (trong các bình luận) để chỉ ra các đường chạy mong muốn

Đặt tệp mới này trong /etc/init.d với tên mô tả. ( ví dụ như myfancyname )

Phương pháp bất khả tri nền tảng để kiểm tra điều này hoặc để bật / tắt (nếu bạn đã sử dụng tệp bộ xương )

sudo /etc/init.d/myfancyname start
sudo /etc/init.d/myfancyname stop
sudo /etc/init.d/myfancyname restart

Có các phương thức phân phối cụ thể để thực hiện các hành động tương tự này, ví dụ, Debian sử dụng update-rc.d myfancyname [start | stop | enable | vô hiệu hóa ...]

Sửa đổi inittab nói chung là một ý tưởng tồi , nếu bạn làm hỏng nó, hệ thống không còn khởi động nữa, và sau đó bạn đã gặp phải HAI vấn đề. (không cần regex!)

Thêm tập lệnh vào thư mục con /etc/init.d/ được chuẩn hóa hơn, có thể được sử dụng với hầu hết mọi hương vị linux, có thể là một số * nix, có thể là một số bsd.


3

Bạn cần chạy telinit qđể báo cho init tải lại /etc/inittab, nó sẽ không tự động làm điều đó. Tôi nghĩ bạn đã làm điều đó kể từ khi bạn đề cập đến Re-reading inittabtin nhắn (bạn đã thấy tin nhắn này, phải không?) Trong nhật ký hệ thống.

Là vấn đề mà quá trình của bạn không bắt đầu chút nào, hay chương trình của bạn bị lỗi trong quá trình khởi động? Viết tập lệnh bao bọc chuyển hướng lỗi sang tệp nhật ký:

#!/bin/sh
exec >/var/log/myprogram.log 2>&1 
exec /home/bits/MyProgram/start.myprogram

Kiểm tra nếu tệp nhật ký được tạo và xem có lỗi nào xuất hiện trong đó không.

Một điều mà tôi suy nghĩ là chương trình của bạn có thể yêu cầu các biến môi trường được đặt trong phiên của bạn. Các initquá trình có một môi trường rất hạn chế. Nếu cần, sửa đổi tập lệnh trình bao bọc để đặt tất cả các biến cần thiết.


Xin lỗi vì đã mất một thời gian để quay lại với bạn, máy ảo thử nghiệm của tôi đã ngừng hoạt động khiến tôi mất một lúc để tìm ra cái gì sai. Dù sao, tôi đã thử những gì bạn đề xuất nhưng điều đó cũng không bắt đầu, đó không phải là chương trình của tôi không khởi động, nó chỉ không bao giờ bắt đầu chương trình. Tôi đã thêm nội dung của tập lệnh bắt đầu vào câu hỏi của mình trong trường hợp nó có ích.
Boardy

@Boardy Bạn đã thử với một đường dẫn tuyệt đối cho tệp nhật ký chưa? Bạn có thấy Re-reading inittabtin nhắn không?
Gilles 'SO- ngừng trở nên xấu xa'

Đúng, tôi đã thử điều đó và nó nói rằng nó đang tải lại sau khi tôi chạy telinit q
Boardy

1

Khi initđọc một lệnh để thực thi inittab, nó sẽ tạo một shell và gửi Command dưới dạng tham số cho execlệnh trong shell đó. Vì vậy, hãy kiểm tra những gì sẽ xảy ra nếu bạn tự làm:

sh -c exec /home/bits/MyProgram/start.myprogram

Một điều nữa mà tôi sẽ thử, là bỏ qua hoàn toàn kịch bản trình khởi chạy, với một cái gì đó như thế này trong inittab:

bes:2345:respawn:/usr/bin/mono /home/bits/MyProgram/EmailServer.exe "$@"

Xin chào Cảm ơn sự giúp đỡ của bạn, cả hai đều không hoạt động, cả hai đều cố gắng chương trình không chạy
Boardy

Nếu chương trình không chạy với lệnh đầu tiên, nó sẽ không chạy từ đó inittab, vì vậy bạn cần tạm thời bỏ qua inittabvà khắc phục lý do tại sao tập lệnh không khởi chạy chung. Là /home/bits/MyProgram/start.myprogramthực thi?
Marios Zindilis

Đúng, nếu tôi có thể chạy nó từ bất kỳ vị trí nào trên máy chủ không nhất thiết là nơi tệp được lưu trữ và chương trình khởi chạy thành công.
Boardy

@MarioZindillis Chỉ cần phát hiện ra nếu tôi chạy tệp thực thi, thay vì tập lệnh bắt đầu sử dụng, exec /home/bits/MyProgram/EmailServer.exenó sẽ xuất hiện một lỗi nêu rõ-bash: /home/bits/EmailServer/EmailServer.exe: Permission denied -bash: exec: /home/bits/EmailServer/EmailServer.exe: cannot execute: Permission denied
Boardy

@MarioZindillis Tôi vừa thử chạy một tập lệnh cơ bản không cố thực thi chương trình của mình, thay vào đó, nó sẽ chỉ viết một từ vào một tệp và tệp này không bao giờ được viết nhưng nếu tôi chạy tập lệnh theo cách thủ công thì nó sẽ chạy.
Boardy
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.