সিস্টেমেড সার্ভিসের আউটপুট কীভাবে কোনও ফাইলে পুনর্নির্দেশ করা যায়


171

আমি কোনও systemdসেবার আউটপুট একটি ফাইলে পুনর্নির্দেশের চেষ্টা করছি তবে এটি কাজ করছে বলে মনে হচ্ছে না:

[Unit]
Description=customprocess
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server
StandardOutput=/var/log1.log
StandardError=/var/log2.log
Restart=always

[Install]
WantedBy=multi-user.target

আমার পদ্ধতির সংশোধন করুন।

উত্তর:


234

আমি মনে করি সমস্যাটি সমাধানের আরও একটি মার্জিত উপায় আছে: একটি সনাক্তকারী দিয়ে সিসলগে stdout / stderr প্রেরণ করুন এবং আপনার সিসলগ ম্যানেজারকে প্রোগ্রামের নামে এটির আউটপুট বিভক্ত করার জন্য নির্দেশ দিন।

আপনার সিস্টেমড সার্ভিস ইউনিট ফাইলে নিম্নলিখিত বৈশিষ্ট্যগুলি ব্যবহার করুন:

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote

তারপরে, ধরে নিই যে আপনার বিতরণটি সিসলোগগুলি পরিচালনা করতে rsyslog ব্যবহার করছে, নিম্নলিখিত লিখিত /etc/rsyslog.d/<new_file>.confসামগ্রী সহ একটি ফাইল তৈরি করুন :

if $programname == '<your program identifier>' then /path/to/log/file.log
& stop

এখন লগ ফাইলটি syslog দ্বারা লিখনযোগ্য করুন:

# ls -alth /var/log/syslog 
-rw-r----- 1 syslog adm 439K Mar  5 19:35 /var/log/syslog
# chown syslog:adm /path/to/log/file.log

আরএসআস্লগ পুনরায় আরম্ভ করুন ( sudo systemctl restart rsyslog) এবং উপভোগ করুন! আপনার প্রোগ্রাম stdout / stderr জার্নালটিএল ( sudo journalctl -u <your program identifier>) এর মাধ্যমে এখনও উপলব্ধ থাকবে তবে সেগুলি আপনার পছন্দের ফাইলটিতেও পাওয়া যাবে।

সংরক্ষণাগার.অর্গের মাধ্যমে উত্স


8
উবুন্টু 16.04 এ আমার পক্ষে কাজ করছে না। journalctl -uএখনও কাজ করে তবে নির্দিষ্ট ফাইলে কিছুই পাঠানো হয় না।
ডানকান কালভার্ট

1
এটি দেবিয়ান প্রসারিতটিতে দুর্দান্ত কাজ করে, তবে এটি অভিযোগ করে যে ~অবনতিযুক্ত এবং stopপরিবর্তে ব্যবহার করা উচিত। আরও মনে রাখবেন যে দুটি লাইন & stopএকে অপরের পরে আসার পরে দ্বিতীয় লাইনটি সংক্ষিপ্ত করা যেতে পারে ।
jlh

47
সিস্টেমেড 236 বা আরও নতুন দিয়ে আপনি স্ট্যান্ডার্ডআউটপুট = ফাইল ব্যবহার করে কোনও ফাইলটিতে সরাসরি লিখতে পারেন: / কিছু / পথ github.com/systemd/systemd/pull/7198
লিজু

5
আমি এইগুলিতে/etc/rsyslog.d/<newfile>.conf বিষয়বস্তু পরিবর্তন করে এই কাজটি পেয়েছি :programname, isequal, "<your program identifier>" /var/log/somelog.log : আরএসস্লগ ফিল্টারগুলিতে এখানে ডকুমেন্টেশন: rsyslog.com/doc/v8-stable/configration/filters.html এবং এখানে বৈশিষ্ট্যগুলির মতো এখানে ডক্স রয়েছে programname: rsyslog.com/doc/master/configration/properties .html
এমবিল

1
আমার এই কনফিগারেশনটি ব্যবহার না করা অবধি আমার সমস্যা হয়েছে যতক্ষণ না আমি rsyslogতার নিজস্ব ব্যবহারকারীর উপস্থিতি পেয়েছি syslogএবং এটি লগগুলির স্থানে লেখার অ্যাক্সেস থাকতে হবে। সুতরাং chownসেই অনুযায়ী ব্যবহার করুন । আশা করি এটি কারও সাহায্য করবে।
ইমাস্কার

73

আপনি একটি নতুন সঙ্গে একটি নতুন ডিস্ট্রো যদি systemd( systemdসংস্করণ 236 অথবা ঊর্ধ্বতন সংস্করণ ), আপনি মান সেট করতে পারেন StandardOutputঅথবা StandardErrorকরতে file:YOUR_ABSPATH_FILENAME


দীর্ঘ কাহিনী:

এর নতুন সংস্করণগুলিতে systemdঅপেক্ষাকৃত নতুন বিকল্প রয়েছে ( গিথুব অনুরোধটি ২০১ 2016 ইশ থেকে এবং বর্ধিতকরণটি মার্জ / বন্ধ করা হয়েছে ২০১ is ইশ ) যেখানে আপনি এর মান সেট করতে পারবেন StandardOutputবা StandardErrorকরতে পারেন file:YOUR_ABSPATH_FILENAMEfile:pathবিকল্প নথিভুক্ত করা সাম্প্রতিকতম systemd.execman পৃষ্ঠা

এই নতুন বৈশিষ্ট্যটি তুলনামূলকভাবে নতুন এবং তাই সেন্টোস-7 (বা এর আগে কোনও সেন্টো) এর মতো পুরানো ডিস্ট্রোদের জন্য উপলভ্য নয়।


10
2018-03-20 এ উবুন্টু 1604 এ কাজ করছেন না। উবুন্টু 1604 সালে systemd হল সংস্করণ শুধুমাত্র 229. হয়
ব্রোঞ্জ মানুষ

ধন্যবাদ, আপনি খুব স্পষ্ট বলেছেন। আমি ঠিক বিশ্বাস করতে পারি না উবুন্টু 1604-এ থাকা সিস্টেমড কেবল কনফিগারেশনের মাধ্যমে কোনও ফাইলে আউটপুট পুনর্নির্দেশ করতে পারে না I এই সমস্যাটি সমাধান করার জন্য আমাকে sh উপায় ব্যবহার করতে হবে।
ব্রোঞ্জের মানুষ

@ ব্রোঞ্জম্যান বৈশিষ্ট্যটির অনুরোধটি ২০১ until সাল পর্যন্ত বন্ধ ছিল না, যখন উবুন্টু ১ 2016.০৪ প্রকাশিত হয়েছে। উবুন্টু প্রদত্ত একটি বড় রিলিজে (উদাঃ ১.0.০৪, ১..১০, ১.0.০৪ ইত্যাদি) উবুন্টু তার মূল সিস্টেম প্যাকেজগুলিতে এবিআইয়ের সামঞ্জস্যতা বজায় রাখে। সুতরাং তারা সিস্টেমেড (বা লিনাক্স কার্নেল, বা গ্লিবসি, বা অন্য কিছু) আপগ্রেড করবে না যদি না এটি উবুন্টু সংস্করণটি প্রথম প্রকাশিত হওয়ার সময়কার মতো একই এবিআই বজায় রাখে।
ভিলাপেক্স

1
FWIW: আমি একটি বিট অনুসন্ধান করেছেন কিন্তু এই বৈশিষ্ট্যটি এক লাইক ব্যবহার করতে থাকার সঙ্গে, এই ধরনের লগ ফাইল পুনরায় চালু করার ফাংশন হিসাবে লগ ঘূর্ণন জন্য বিধান আছে, মনে হচ্ছে না copytruncateযে logrotate
আনতক

49

আপনি সম্ভবত এই ত্রুটি পান:

Failed to parse output specifier, ignoring: /var/log1.log

থেকে systemd.exec(5)মানুষ পৃষ্ঠা:

StandardOutput=

সম্পাদিত প্রক্রিয়াগুলির ফাইল বর্ণনাকারী 1 (STDOUT) এর সাথে সংযুক্ত রয়েছে যেখানে নিয়ন্ত্রণ করে। এক লাগে inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+consoleবা socket

systemd.exec(5)Man পৃষ্ঠা লগিং এর সাথে সম্পর্কিত অন্যান্য অপশন ব্যাখ্যা করে। আরও দেখুন systemd.service(5)এবং systemd.unit(5)মানুষ পেজ।

অথবা আপনি এই জাতীয় জিনিসগুলি চেষ্টা করতে পারেন (সমস্ত এক লাইনে):

ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log' 

7
বিকল্পগুলির মধ্যে, সিস্টেমড জার্নালে লগইন করার পরামর্শ দেওয়া হয়। আপনি জার্নালে আপনার প্রক্রিয়াটির জন্য কেবল লগগুলি ব্যবহার করে দেখেন journalctl -u your-unit-name
মার্ক স্টোসবার্গ

6
একটি ফাইল নির্দিষ্ট করতে, অন্য একটি ক্লিনার বিকল্প রয়েছে, যেমন ডকুমেন্টেশনের দ্বারা নির্দেশিত:The fd option connects the output stream to a single file descriptor provided by a socket unit. A custom named file descriptor can be specified as part of this option, after a ":" (e.g. "fd:foobar").
অরিয়ন

5
অসাধারণ উত্তর, এটি আমার সমস্যার সমাধান করে। : আমি শুধুমাত্র প্রসারিত করতে, কারণ বর্তমানে যদি সেবা পুরাতন লগ ওভাররাইট পুনরায় চালু করুন, এই অংশ প্রতিস্থাপন আছে চান 2>&1 > /var/log.logএই: 2>&1 >> /var/log.log। আপনাকে ধন্যবাদ
পাম্পকিনসিড

10
সত্যই, এক্সিকিস্টার্টে কমান্ড স্ট্রিং সহ শেলকে কল করা সত্যিই এটির মতো ভুল উপায় বলে মনে হচ্ছে।
ডেভিড টনহোফার

1
"/ বিন / শ" একটি দুর্দান্ত কাজ, তবে আপনি "এক্সিকিউটিভ" ব্যবহার করা উচিত, অন্যথায় পরিষেবাটি সঠিকভাবে পুনরায় আরম্ভ হবে না কারণ সাইন্টার্ম শিশু প্রক্রিয়ায় পাস হবে না। দেখুন veithen.io/2014/11/16/sigterm-propagation.html
রিচ

33

আমি সিস্টেমেড ফাইলটিতে নিজেই যুক্ত stdoutএবং stderrফাইল করার পরামর্শ দেব service

উল্লেখ: https://www.freedesktop.org/software/systemd/man/systemd.exec.html# স্ট্যান্ডার্ডআউটপুট

আপনি কনফিগার করেছেন যেমন এটি পছন্দ করা উচিত নয়:

StandardOutput=/home/user/log1.log
StandardError=/home/user/log2.log

এটা করা উচিত:

StandardOutput=file:/home/user/log1.log
StandardError=file:/home/user/log2.log

আপনি যখন পরিষেবাটি বারবার আরম্ভ করতে চান না তখন এটি কাজ করে

এটি একটি নতুন ফাইল তৈরি করবে এবং বিদ্যমান ফাইলে সংযুক্ত হবে না।

পরিবর্তে ব্যবহার করুন:

StandardOutput=append:/home/user/log1.log
StandardError=append:/home/user/log2.log

দ্রষ্টব্য: আপনি ডিরেক্টরিটি ইতিমধ্যে তৈরি করেছেন তা নিশ্চিত করুন। আমার ধারণা এটি কোনও ডিরেক্টরি তৈরি করতে সমর্থন করে না।


5
এই তথ্যের সদৃশ, কম বিশদ সহ
জার্ট ভ্যান ডান বার্গ

9
আমার মনে হয়, আমি এটিকে আরও প্রত্যক্ষ করেছি understand বুঝতে সহজ।
রজত জেইন

1
আমার জন্য file:রুটটি পরিষেবার প্রথম লোডে কাজ করে, তবে পরবর্তী সময়ে পুনরায় আরম্ভ করার পরে এটি আর ফাইলটিতে লেখেন না। আমি append:ডক্স থেকে চেষ্টা করেছি এবং এটি মোটেই কার্যকর হয়নি।
আরবি-

3
নোট করুন যে দস্তাবেজগুলি স্পষ্ট করে দেয় যা file:প্রতিবার ফাইলের শুরুতে লেখা থাকে, এবং কেটে ফেলা হয় না ... আরও append:একটি নতুন সংযোজন বলে মনে হয় (যেমন man systemd.execউবুন্টু 18.04 এর পৃষ্ঠায় উপস্থিত নেই )।
কোলে

19

যদি কোনও কারণে আরএসস্লগ ব্যবহার না করতে পারে তবে এটি করবে: ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"


ব্যাশের -e বিকল্পটি কী করে?
ল্যাম্প

3

ধরুন লগগুলি ইতিমধ্যে stdout / stderr এ রাখা হয়েছে এবং সিস্টেম ইউনিটের লগ ইন রয়েছে in/var/log/syslog

journalctl -u unitxxx.service

Jun 30 13:51:46 host unitxxx[1437]: time="2018-06-30T11:51:46Z" level=info msg="127.0.0.1
Jun 30 15:02:15 host unitxxx[1437]: time="2018-06-30T13:02:15Z" level=info msg="127.0.0.1
Jun 30 15:33:02 host unitxxx[1437]: time="2018-06-30T13:33:02Z" level=info msg="127.0.0.1
Jun 30 15:56:31 host unitxxx[1437]: time="2018-06-30T13:56:31Z" level=info msg="127.0.0.1

কনফিগারেশন rsyslog (সিস্টেম লগিং পরিষেবা)

# Create directory for log file
mkdir /var/log/unitxxx

# Then add config file /etc/rsyslog.d/unitxxx.conf

if $programname == 'unitxxx' then /var/log/unitxxx/unitxxx.log
& stop

আরএসএসলগ পুনরায় আরম্ভ করুন

systemctl restart rsyslog.service

1

আমরা Centos7, systemd সহ বসন্ত বুট অ্যাপ্লিকেশন ব্যবহার করছি। আমি নীচে হিসাবে জাভা চলমান ছিল। এবং স্ট্যান্ডার্ড আউটপুট ফাইলে সেট করা আমার পক্ষে কাজ করে না।

ExecStart=/bin/java -jar xxx.jar  -Xmx512-Xms32M

স্ট্যান্ডার্ডআউটপুট সেট না করে ওয়ার্কআরউন্ড সমাধানের নীচে কাজ করছে। নীচে হিসাবে শ মাধ্যমে জাভা চলমান।


ExecStart=/bin/sh -c 'exec /bin/java -jar xxx.jar -Xmx512M -Xms32M >> /data/logs/xxx.log 2>&1'

এখানে চিত্র বর্ণনা লিখুন


ভুল ক্রমে jvm পরামিতিগুলি সংজ্ঞায়িত করার জন্য -1। -জমারের আগে অবশ্যই এক্সএক্সএক্স 512 এম সংজ্ঞায়িত করা উচিত। এছাড়াও আপনি কি অভিজ্ঞতা প্রত্যাশিত। সিস্টেমড শেল ব্যবহার করে পরিষেবাগুলি শুরু করে না
সামি কোরহোনেন

1
@ সামিকোরহোনেন, এটি কাজ করার পরে আমি আমার মন্তব্যগুলি যুক্ত করেছি testing এমনকি আমি ভাবছিলাম যে -Xmx512M অর্ডারটি আপনার জন্য হাসিখুশি। অন্ধ মন্তব্য যুক্ত করার আগে দয়া করে পরীক্ষা করুন।
সন্তোষ হিরেকেরুর

0

সংক্ষিপ্ত উত্তর:

StandardOutput=file:/var/log1.log
StandardError=file:/var/log2.log

আপনি যদি সার্ভিসটি চালু হওয়ার সাথে সাথে ফাইলগুলি সাফ হওয়ার জন্য না চান তবে পরিবর্তে অ্যাপেন্ড ব্যবহার করুন:

StandardOutput=append:/var/log1.log
StandardError=append:/var/log2.log

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.