Ashish Kumar
Ashish Kumar

Reputation: 51

Error in systemd service in linux (Ubuntu)

I am trying to create service in Ubuntu but I am getting error.

I wrote below code-

In FileSystemWatcher.py

import requests
import json
import logging
import sys
import os
import datetime
from watchdog.events import PatternMatchingEventHandler


class DirectoryChangedHandler(PatternMatchingEventHandler):

    patterns = ["*.json","*.csv"]

    logFileName = datetime.datetime.now().strftime('%Y%m%d_log.log')
    script_dir = os.path.dirname(__file__)  # <-- absolute dir the script is in
    rel_path = "log/"+logFileName
    abs_logfile_path = os.path.join(script_dir, rel_path)

    appConfigFilePath = os.path.abspath('config/app_config.json')
    with open(appConfigFilePath) as data_file:
        config = json.load(data_file)
    logging.basicConfig(filename=abs_logfile_path, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.NOTSET)

    def process(self, event):

        print event.src_path, event.event_type
        try:

            filelist = [('files', open(event.src_path, 'rb'))]
            postUrl = self.config["apiBaseUrl"].encode('utf-8')+self.config["fileUplaodApiUrl"].encode('utf-8')
            uploadResponse = requests.post(postUrl, files=filelist)
            if uploadResponse.status_code == 200:
                print "Upload Successful - ", event.src_path
            else:
                print "Upload Failed - ", event.src_path
        except:
            print "Unexpected error:", sys.exc_info()[0]
            pass

    def on_modified(self, event):
        self.process(event)

    def on_created(self, event):
        self.process(event)

workflow.py-

#!/usr/bin/python2.7

import sys
import time
from watchdog.observers import Observer

import FileSystemWatcher as fSystemWatcher


if __name__ == '__main__':
    args = sys.argv[1:]
    observer = Observer()
    observer.schedule(fSystemWatcher.DirectoryChangedHandler(), path=args[0] if args else '.', recursive=True)
    observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        observer.stop()

    observer.join()

and (/lib/systemd/system/FileWatcherSystemd.service)

[Unit]
Description=FileChangeService

[Service]
Type=forking
WorkingDirectory= /home/ashish/Documents/FileSystemWatcher
ExecStart= /home/ashish/Documents/FileSystemWatcher/workflow.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

But i am getting following error-

FileWatcherSystemd.service - FileChangeService Loaded: loaded (/lib/systemd/system/FileWatcherSystemd.service; enabled; vendor preset: enabled) Active: inactive (dead) (Result: exit-code) since Wed 2017-07-19 10:44:39 IST; 8min ago Process: 6552 ExecStart=/home/ashish/Documents/FileSystemWatcher/FileSystemWatcher.py (code=exited, status=203/EXEC) Main PID: 6552 (code=exited, status=203/EXEC)

Jul 19 10:44:39 Ashish-PC systemd[1]: FileWatcherSystemd.service: Unit entered failed state. Jul 19 10:44:39 Ashish-PC systemd[1]: FileWatcherSystemd.service: Failed with result 'exit-code'. Jul 19 10:44:39 Ashish-PC systemd[1]: FileWatcherSystemd.service: Service hold-off time over, scheduling restart. Jul 19 10:44:39 Ashish-PC systemd[1]: Stopped FileChangeService. Jul 19 10:44:39 Ashish-PC systemd[1]: FileWatcherSystemd.service: Start request repeated too quickly. Jul 19 10:44:39 Ashish-PC systemd[1]: Failed to start FileChangeService.

I don't know what I am doing wrong in FileSytemWatcher.py or in FileWatcherSystemd.service

Upvotes: 2

Views: 2849

Answers (1)

Hannu
Hannu

Reputation: 12205

Try changing your service type to simple. So

type=simple

Your script does not seem to fork and exit. If your service type is forking, systemd assumes the started process forks, leaves something running in the background and exits. It waits until your script has finished running.

Your script does not exit, and systemd detects this and gives you the timeout error. Your script just seems to be in infinite while loop waiting for keyboard interrupt. This kind of script can be run as "simple". It means systemd just starts the script in the background and moves on with the startup sequence without waiting for anything.

Upvotes: 2

Related Questions